2011-09-22 34 views
1

我正在嘗試編寫一個bash腳本來計算特定模式在文件列表上的匹配次數。計算多個文件中特定正則表達式的出現次數

我已經搜索瞭解決方案,但我只找到單個文件的解決方案。

我知道我可以使用egrep -o PATTERN file,但是我如何概括文件列表並在最後輸出總和?

編輯:添加腳本我想寫:

#! /bin/bash 

egrep -o -c "\s*assert.*;" $1 | awk -F: '{sum+=$2} END{print sum}' 

在命令行中運行egrep的直接工作正常,但一個bash腳本中沒有。我是否需要特別保護RegEx?

+0

恐怕這個要求是非常特殊的,你必須明確地做到這一點。 – TMS

回答

4

你可以使用grep -c來統計每個文件中的比賽,然後在結尾使用awk總結計數,如:

grep -c PATTERN * | awk -F: '{sum+=$2} END{print sum}' 
+0

我從來沒有使用awk,似乎是一個漂亮的小東西。我想把它放在一個bash腳本上,但它不起作用,它總是返回'0'。看看上面的腳本。 –

+0

@TiagoVeloso:'grep -c PATTERN *'是什麼打印出來的?它應該是'file:count',每個輸入文件一行。 – NPE

+0

它正在如此工作,只有當我將該命令放在腳本文件上時纔會出現問題。 –

3
grep -o <pattern> file1 [file2 .. | *] | 
    uniq -c 

如果你只想要總:

grep -o <pattern> file1 [file2 .. | *] | wc -l 

編輯:這種排序似乎沒有必要。

+1

+1。水衣櫥實用岩石:) – 2011-09-22 15:07:16

1

接受的答案有一個問題,grep將計爲1,即使PATTERN可能會在一行上出現多次。此外,一個命令可以完成這項工作

awk 'BEGIN{RS="\0777";FS="PATTERN"} { print NF-1 } ' file 
相關問題