Grep 计数“X”以上的匹配项

Grep 计数“X”以上的匹配项

我正在尝试找出一个与高于特定计数的所有计数相匹配的命令。我在用

grep -src 'Bicycle' /cygdrive/c/Documents/* |grep -v ':0$'

输出是:

/cygdrive/c/Documents/blahhh.txt:1
/cygdrive/c/Documents/blahhh.txt:3
/cygdrive/c/Documents/bla0.txt:5
/cygdrive/c/Documents/blahg.txt:23

但我只想让它输出:

/cygdrive/c/Documents/blahg.txt:23

我已经搜索了很多这个。如果有人能引导我朝正确的方向前进,那就太棒了。

答案1

一种简单的方法是通过管道传输grepto的输出awk,并通过设置分隔符 as 来解析它,:并检查最后一个字段计数是否大于X您要定义的字段计数

grep -src 'Bicycle' /cygdrive/c/Documents/* | awk -F: '$NF+0 > 1'

在上面的示例中,我取出了大于 的出现次数1。根据需要修改它。

$NF+0 > 1结束 just 的原因$NF > 1是进行纯数字评估,考虑存在空字符串或数字字符串的情况,将0其添加到正确的数字进行比较,否则比较两边的类型都不正确。

如何awk在字符串和数字之间进行转换

如果出于某种原因,您需要强制将数字转换为字符串,请将该数字与空字符串 串联起来""。要强制将字符串转换为数字,请向该字符串添加零。

答案2

使用 GNU awk

awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

请注意,它计算的是数量线包含Bicycle,而不是出现的次数Bicycle 单词。为此,您需要:

awk -v min=10 '
  BEGINFILE{n=0}
  {n += gsub(/Bicycle/, "&")}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

对于递归搜索:

find /cygdrive/c/Documents -type f -exec awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' {} +

答案3

方法1

 grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '{print $1,$2}' | sort -nr -k2| head -1

方法2

这里我考虑显示计数大于 3 的文件

grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '$2 > "3"{print $1,$2}'

相关内容