搜索文件中的用户名,并为文件中的每个用户排序实例数?

时间:2018-05-17 04:03:05

标签: grep wc

我的任务是获取包含字符串username=xxxx

的行条目的文件
$ cat file.txt
Yadayada username=jdoe blablabla
Yadayada username=jdoe blablabla
Yadayada username=jdoe blablabla
Yadayada username=dsmith blablabla
Yadayada username=dsmith blablabla
Yadayada username=sjones blablabla

查看文件中每个用户显示的次数,我可以通过提供username=jdoe手动执行此操作,例如:

$ grep -r "username=jdoe" file.txt  | wc -l | tr -d ' '
3

报告文件中每个用户的最佳方式是什么,以及从最高到最低实例排序的每个用户的行数:

3    jdoe
2    dsmith
1    sjones

一直在考虑如何处理这个问题,但是在绘制空白时,我想在这个论坛上与我们的大师一起检查。 :)

TIA, 唐

6 个答案:

答案 0 :(得分:0)

使用sed,uniq和sort:

sed 's/.*username=\([^ ]*\).*/\1/' file.txt | sort | uniq -c | sort -nr

如果有没有用户名的行:

sed -n 's/.*username=\([^ ]*\).*/\1/p' input | sort | uniq -c | sort -nr

答案 1 :(得分:0)

在GNU awk中:

$ awk '
BEGIN { RS="[ \n]" }
/=/ {
    split($0,a,"=")
    u[a[2]]++ }
END {
    PROCINFO["sorted_in"]="@val_num_desc"
    for(i in u)
        print u[i],i
}' file
3 jdoe
2 dsmith
1 sjones

答案 2 :(得分:0)

使用grep:

$ grep -o 'username=[^ ]*' file | cut -d "=" -f 2 | sort | uniq -c | sort -nr

答案 3 :(得分:0)

单独使用Awk:

awk '
  {sub(/.*username=/,""); sub(/ .*/,"")}
  {a[$0]++}
  END {for(i in a) printf "%d\t%s\n",a[i],i | "sort -nr"}
' file.txt

这使用awk的sub()函数来实现grep -o在其他答案中的作用。它在awk脚本中嵌入了对sort的调用。当然,您可以在awk脚本之后使用该管道,而不是在您喜欢的内部。

哦,与此处介绍的其他awk解决方案不同,这一个(1)可以移植到非GNU-awk环境(如BSD,macOS),并且不依赖于位于可预测位置的用户名每一行(即$ 2)。

为什么awk比uniq之类的简单工具更好?对于像这样的超级简单要求,它可能不会。但是如果你想要一些能够进行更多文本处理的东西,那么你可以在工具箱中使用它。

答案 4 :(得分:0)

$ awk -F'[= ]' '{print $3}' file | sort | uniq -c | sort -nr
      3 jdoe
      2 dsmith
      1 sjones

答案 5 :(得分:0)

关注awk也可以帮助您。

awk -F"[ =]" '{a[$3]++} END{for(i in a){print a[i],i | "sort -nr"}}'  Input_file