问题
我有一个自定义日志文件的输出,如下所示:
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 , yum和install 只 。
回答
一个经典的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
回答
使用cut , sort和uniq :
$ 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 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