0

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

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

我想知道是否有办法计算第三个字段的特定值的数量。例如,我可能想计算cd,yuminstall 的数量。

4

7 回答 7

1

完成这项工作的经典 shell 脚本是:

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

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

如果您使用的是 GNU awk,您可以在awk脚本中完成所有操作;它可能更有效,但对于真正庞大的文件,它可能会在管道没有的地方耗尽内存(sort必要时溢出到磁盘;编写代码以溢出到磁盘awk是不明智的)。

于 2013-08-28T17:18:04.963 回答
1

您可以使用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
于 2013-08-28T17:19:35.413 回答
1

使用cut,sortuniq:

$ cut -d" " -f3 inputfile | sort | uniq -c
      2 cd
      1 install
      1 ./linux
      6 make
      6 yum
于 2013-08-28T17:25:10.130 回答
0

用于awk计算字段三的出现次数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

grep要停止部分匹配,例如egrep使用单词边界\<\>,过滤器将是/\<cd\>|\<yum\>|\<install\>/

于 2013-08-28T17:16:56.560 回答
0

对于您的输入

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

将打印:

cd      2
install 1
./linux 1
make    6
yum     6
于 2013-08-28T17:19:34.167 回答
0

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

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

解释:

  • -x标志仅匹配完全匹配的行,就像使用^pattern$
  • cut仅提取第 3列
  • sort在从输入中删除所有垃圾之后,我们uniq最终计数以提高效率
于 2013-08-28T17:45:49.600 回答
-1

我想你想分别计算yum install&的值cd。如果是这样,您应该选择 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

于 2013-08-29T07:29:56.070 回答