Grep 搜索文件中的用户名,并对文件中每个用户的实例数进行排序?

Grep 搜索文件中的用户名,并对文件中每个用户的实例数进行排序?,grep,wc,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 blabl

我的任务是获取一个包含字符串
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
我一直在考虑如何解决这个问题,但我还是画了个空白,我想我会在这个论坛上向我们的导师请教

蒂亚,
不要使用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
在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
使用grep:

$ grep -o 'username=[^ ]*' file | cut -d "=" -f 2 | sort | uniq -c | sort -nr
仅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脚本中。当然,如果愿意,您可以在awk脚本之后使用该管道,而不是在其中使用

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


为什么awk比像uniq这样的简单工具更好?对于这样一个超级简单的需求,它可能不会。但是,如果您想要更多的文本处理功能,最好将其放在工具箱中。

下面的
awk
也可能对您有所帮助

$ awk -F'[= ]' '{print $3}' file | sort | uniq -c | sort -nr
      3 jdoe
      2 dsmith
      1 sjones
awk -F"[ =]" '{a[$3]++} END{for(i in a){print a[i],i | "sort -nr"}}'  Input_file

如果用户未按顺序出现,则此操作将中断。你们可以将第一行移到最后一行进行验证,然后再试一次。来自这么多人的精彩反馈,我希望我能为你们所有人提供啤酒!!!这是有效的:
sed-n's/*username=\([^]*\)./\1/p'input | sort | uniq-c | sort-nr
但我得到一个单行返回:
3jdoe2dsmith 1sjones
。这可能就是我们所需要的,但是想知道是否有办法保存回车?输出来自排序,必须有换行符。您是如何从终端运行该命令的?你的操作系统是什么?@perreal我在脚本中添加了这一行。很抱歉,我需要在额头上纹身“在stackOverflow帖子上始终包含操作系统信息”。)这是在macOS(High Sierra 10.13.4)上。Don是个申请者。我怀疑他的Mac电脑带有BSD awk(是的,我知道,他没有具体说明。谢谢你具体说明。)苹果的awk对
RS=“[\n]”
的感觉如何?真的,橙子DMulti char RS是特定于gawk的。嗯,也许这些天mawks也在使用gawk功能。但仅此而已。PROCINFO同上,已排序为。顺便说一句,我注意到您最近在几个脚本中使用了一个字符串作为第三个参数to split(),第三个参数to split()是一个regexp,而不是一个字符串,因此您应该使用regexp分隔符,以便awk不使用“;在使用它之前,不必将它从字符串转换为regexp。快速且肮脏。我被纠正了。别让我开始喝咖啡了,我不能再喝了。可能与最近的马虎有关。