计算匹配特定模式的行的最简单方法,如果找不到行,则包括“0”?

Paw*_*ian 4 grep sort uniq wc

我有非常大的日志(每天几 GB),可以(但不需要)包含特定行。我必须每天计算这些行中每一行的出现次数。

我有一个文件patterns.in,其中包含所需的行。例如:

aaaa
bbbb
cccc
dddd
eeee
ffff
Run Code Online (Sandbox Code Playgroud)

日志文件可能如下所示:

asd
dfg
aaaa
aaaa
sa
sdf
dddd
dddd
dddd
dddd
ghj
bbbb
cccc
cccc
cccc
fgg
fgh
hjk
Run Code Online (Sandbox Code Playgroud)

第一种(也许也是最明显的方法)是使用grep,sortuniq以下列方式:

grep -f patterns.in logfile.txt | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

   2 aaaa
   1 bbbb
   3 cccc
   4 dddd
Run Code Online (Sandbox Code Playgroud)

它接近我想要实现的目标,但我想要的结果是:

   2 aaaa
   1 bbbb
   3 cccc
   4 dddd
   0 eeee
   0 ffff
Run Code Online (Sandbox Code Playgroud)

所以问题是:如果pattern.in文件中的一行不匹配,如何打印“0” ?它需要以最简单的方式完成,因为我所拥有的只是cygwin环境。

iru*_*var 7

如何将模式文件作为数据文件送回,以便每个模式至少找到一个匹配项,然后从每个匹配项的最终报告计数中减去一个

grep -f patterns.in logfile.txt patterns.in | cut -f2 -d':' | sort | uniq -c | awk '{print($1 - 1" "$2)}'
Run Code Online (Sandbox Code Playgroud)

  • +1,很好的答案。你可以使用 grep 的 `-h` 或 `--no-filename` 选项来阻止 grep 打印文件名。例如`grep -h -o -f patterns.in logfile.txt patterns.in sort | uniq -c | awk '{print($1 - 1" "$2)}'` (2认同)
  • @gorkypl,结合了 Craig Sander 的 grep -h 建议并修改了命令以使用多个输入词,这里是。grep -h -f patterns.in logfile.txt patterns.in | 排序 | uniq -c | tr -s ' ' |awk ' {count=$1 - 1; 文件名=$0; sub($1, "", file_name);print(count" "file_name)}' (2认同)