Linux-关于排序shell输出 - stacknoob

200 阅读2分钟
原文链接: www.stacknoob.com
问题

我有一个自定义日志文件的输出,如下所示:

8 24 yum
8 24 yum
8 24 make
8 24 make
8 24 cd
8 24 cd
8 25 make
8 25 make
8 25 make
8 26 yum
8 26 yum
8 26 make
8 27 yum
8 27 install
8 28 ./linux
8 28 yum

我想知道是否还要计算第三个字段的特定值的数量。 例如,我可能要算的数cdyuminstall

linux shell awk
回答

一个经典的shell脚本来完成这项工作:

awk '{print $3}' "$file" | sort | uniq -c | sort -n

使用awk从第3列中提取值,将相同的名称排序在一起,计算重复次数,按递增的顺序对输出进行排序。 sort | uniq -c | sort -n sort | uniq -c | sort -n sort | uniq -c | sort -n part是一个常见的模因。

如果你正在使用GNU awk ,你可以在awk脚本中完成所有操作; 它可能更有效,但是对于非常有价值的文件,它可能会耗尽管道不存在的内存(必要时将溢出sort到磁盘;在awk写入溢出到磁盘的代码是不明智的)。


回答

您可以使用awk来获取第三个字段值,使用wc -l来计算数字。

awk '$3=="cd"||$3=="yum"||$3=="install"||$3=="cat" {print $0}' file | wc -l

您也可以使用egrep ,但这不仅会在第三个字段中查找这些字词,还会在该行中的其他位置查找这些字词。

egrep "(cd|yum|install|cat)" file | wc -l

如果你想计算第三个字段上的特定单词,那么你可以在没有多个正则表达式的情况下完成上述操作。

awk '$3=="cd" {print $0}' | wc -l


回答

使用cutsortuniq

$ cut -d" " -f3 inputfile | sort | uniq -c
      2 cd
      1 install
      1 ./linux
      6 make
      6 yum


回答

使用awk计算字段3的出现次数并sort以对输出进行sort

$ awk '{a[$3]++}END{for(k in a)print a[k],k}' file | sort -n 
1 install
1 ./linux
2 cd
6 make
6 yum

所以按命令过滤:

$ awk '/cd|yum|install/{a[$3]++}END{for(k in a)print a[k],k}' file | sort -n
1 install
2 cd
6 yum

要在egrep停止部分匹配(例如grep ,请使用字边界\\<\\>以便过滤器为/\\<cd\\>|\\<yum\\>|\\<install\\>/


回答

为了你的输入

awk '{++a[$3]}END{for(i in a)print i "\t" a[i];}' file

会打印:

cd      2
install 1
./linux 1
make    6
yum     6


回答

您可以使用grep同时按多个术语进行过滤:

cut -f3 -d' ' file | grep -x -e yum -e make -e install | sort | uniq -c

说明:

  • -x标志仅匹配完全匹配的行,就像使用^pattern$
  • cut仅提取第3列
  • 在从输入中删除所有垃圾之后,我们将uniq与count一起sort以提高效率


回答

我想你想分别计算yum installcd的值。 如果是这样的话,你会发出3个单独的awk声明:

awk '$3=="cd" {print $0}' file | wc -l
awk '$3=="yum" {print $0}' file | wc -l
awk '$3=="install" {print $0}' file | wc -l