我正在尝试找出一个与高于特定计数的所有计数相匹配的命令。我在用
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
一种简单的方法是通过管道传输grep
to的输出awk
,并通过设置分隔符 as 来解析它,:
并检查最后一个字段计数是否大于X
您要定义的字段计数
grep -src 'Bicycle' /cygdrive/c/Documents/* | awk -F: '$NF+0 > 1'
在上面的示例中,我取出了大于 的出现次数1
。根据需要修改它。
$NF+0 > 1
结束 just 的原因$NF > 1
是进行纯数字评估,考虑存在空字符串或数字字符串的情况,将0
其添加到正确的数字进行比较,否则比较两边的类型都不正确。
如果出于某种原因,您需要强制将数字转换为字符串,请将该数字与空字符串 串联起来
""
。要强制将字符串转换为数字,请向该字符串添加零。
答案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}'