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。快速且肮脏。我被纠正了。别让我开始喝咖啡了,我不能再喝了。可能与最近的马虎有关。