计算grep出现次数并将其存储为变量

时间:2016-04-18 07:36:19

标签: bash shell grep

我想做类似的事情 - grep查找特定文件中的字符串,将其存储在变量中,并且只能打印出现次数。

#!/bin/bash
count=$(grep *something* *somefile*| wc -l)
echo $count

当我知道它应该更多时,它总是给出0值。

这就是我打算做的事情,但它会像永远一样完成剧本。

if egrep -iq "Android 6.0.1" $filename; then
        count=$(egrep -ic "Android 6.0.1" $filename)
        echo 'Operating System Version leaked number of times: '$count

我还有其他7个if语句,我正在为大约20个文件运行它。

更快捷的方式让它更快?

2 个答案:

答案 0 :(得分:1)

grep有自己的计数标志

  

-c, - count

     

抑制正常输出;而是打印匹配行的计数   每个输入文件。使用-v, - reverse-match选项(见下文),计数   不匹配的线。 (-c由POSIX指定。)

count=$( grep -c 'match' file)

请注意,匹配部分也是引用的,因此如果使用特殊字符,则shell不会解释它们。

同样如该手册页的摘录中所述,单行上的多个匹配将被计为单个匹配,因为它只计算匹配的行:

$ echo "hello hello hello hello
hello
> bye" | grep -c "hello"
2

答案 1 :(得分:1)

更有效的方法是运行一次Awk。

awk -v patterns="foo,bar,baz" 'BEGIN { n=split(patterns, pats, ",") }
    { for (i=1; i<=n; ++i) if ($0 ~ pats[i]) ++hits[i] }
    END { for (i=1; i<=n; ++i) printf("%8d%s\n", hits[i], pats[i]) }' list of files

对于奖励积分,请以机器可读格式格式化输出(取决于它最终的位置,JSON可能是一个不错的选择);和/或将每个命中重要性的人类可读解释添加到END块。

如果这不是您想要的,那么在最坏的情况下,运行grep -Eic并且放弃任何零值将改善您在每次匹配时将文件翻转两次的运行时间。 (悲观情况是最后一行,而没有其他行符合你的模式。)