Grep:计算每行匹配的数量

Grep:计算每行匹配的数量

我正在尝试获取.tex 文件每行的匹配项数量(在本例中为{或的出现次数)。}

我知道-o标志只返回匹配项,但它会在新行上返回每个匹配项,即使与标志结合也是如此-n。我不知道我可以通过什么管道来计算重复次数。标志-c只返回整个文件中的匹配项总数 - 也许我可以一次将一行管道传输到 grep?

答案1

grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

输出结果如下:

3 1
1 2

意思是第一行出现 3 次,第二行出现 1 次。

取自https://stackoverflow.com/a/15366097/3378354

答案2

阅读了各种解决方案后,我认为这是解决问题最简单的方法:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

答案3

使用是grep必需的吗?这里有一个替代方案:

sed's/[^{}]//g'你的文件| awk'{打印 NR,长度}'

删除sed除 和 之外的所有字符{} 即,仅保留{}字符),然后awk计算每行上的字符(仅是{}字符)。要抑制没有匹配的行,

sed's/[^{}]//g'你的文件| awk'/./{打印 NR,长度}'

请注意,我的解决方案假设(要求)您要查找的字符串是单个字符。Moebius 的答案更容易适应多字符字符串。此外,我们的答案都不排除感兴趣的字符/字符串的引用或转义出现;例如,

{ "nullfunc() {}" }

将被认为包含四个括号字符。

答案4

使用 awk,您可以搜索字符串的出现次数,显示找到该字符串的次数以及找到该字符串的行号。在这里,我只想查看那些包含搜索字符串多次的行。作为输入,我使用 ls 的手册页。我将搜索字符串(此处为“of”)放在一个变量中。

 s='of'; man ls | awk -v s="${s}" '{ if ($0 ~ s) { k = split($0, ar, s); if (k > 2) { print NR, k-1, $0 }}}' | grep "${s}"

输出:

32 2        -c     with -lt: sort by, and show, ctime (time of last modification of file status information); with -l: show ctime and sort by name; otherwise: sort by ctime, newest first
180 2        The  SIZE  argument  is  an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).  Binary prefixes can be used, too: KiB=K,

grep 语句用于为搜索字符串着色(此处不可见)。

相关内容