我的任务是获取包含字符串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, 唐
答案 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