2008-12-16 75 views
225

我有一堆日誌文件。我需要找出一個字符串在所有文件中出現的次數。使用grep計算大量文件中的所有字符串

grep -c string * 

回報

... 
file1:1 
file2:0 
file3:0 
... 

使用管我能得到只具有一個或多個出現文件:

grep -c string * | grep -v :0 

... 
file4:5 
file5:1 
file6:2 
... 

我怎樣才能得到只有結合計數? (如果返回file4:5, file5:1, file6:2,我想返回8.)

+0

你能告訴我是什麼的grep -v:0呢? 。我知道它對出現大於0的文件很重要。-v選項和:0是什麼意思?請讓我知道。 – 2017-05-09 17:57:04

+0

@GauthamHonnavara grep:0查找與字符串匹配的行:0。 -v是反轉該搜索的選項,因此改爲使用grep -v:0表示找到所有不包含的行:0,因此file4:5和file27:193的所有行都會通過,因爲它們不包含: 0 – penguin359 2017-05-16 17:56:05

回答

230
cat * | grep -c string 
+7

這具有相同的侷限性,即它只在一行上計算多次出現次數。不過,我猜這種行爲在這種情況下是可以的。 – 2008-12-16 12:22:00

+0

@邁克爾哈倫是的,一行中只能出現一次字符串。 – 2008-12-16 12:25:56

+2

我寧願做`grep -c string <*`所以只需用小於的空格替換空格即可。 – 2012-01-04 02:08:37

19

而不是使用-c,只需將其輸入到wc -l。

grep string * | wc -l 

這將在一行中列出每個事件,然後計算行數。

雖然這會錯過字符串在一行出現2+次的情況。

+2

配管到「wc -l」也很好地與「grep -r'測試」一起工作。「它遞歸地掃描當前文件下所有目錄中字符串'test'的所有文件。 – nottinhill 2011-12-13 15:07:17

13
cat * | grep -c string 

一個cat罕見有用的應用程序。

256

這適用於每行多次出現:

grep -o string * | wc -l 
6

強制性AWK解決方案:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}' 

小心,如果你的文件名包括 「:」 雖然。

5

的AWK的解決方案,還可以處理文件名,包括冒號:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}' 

請記住,這種方法仍然沒有找到在同一行的string多次出現。

23
grep -oh string * | wc -w 

將計算多次出現在一條線上

9

東西比以前所有的答案不同:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' * 
5

您可以添加-R遞歸搜索(而不是使用CAT)和-I忽略二進制文件。

grep -RIc string . 
0

使用基本命令行函數的另一個oneliner函數每行處理多個出現。

cat * |sed s/string/\\\nstring\ /g |grep string |wc -l 
1

這裏是這樣做的速度快於grep的AWK的替代方式,它處理的<url>每行多個匹配的XML文件的集合中的一個目錄:

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml 

該作品以及在某些XML文件沒有換行符的情況下。

0

您可以使用簡單的grep來有效捕獲出現次數。我將使用-i選項來確保STRING/StrING/string正確捕獲。

命令行,使該文件的名稱:

grep -oci string * | grep -v :0 

命令行刪除的文件名,並打印0如果不出現一個文件:

grep -ochi string * 
1

grep的唯一的解決辦法,我使用grep for windows進行測試:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files" 

此解決方案將計算所有發生的事件即使在同一行上有多個。 -r遞歸搜索目錄,-o將「只顯示匹配PATTERN的行的部分」 - 這是什麼分裂在一條線上的多個出現,並使grep打印每一個匹配的新行;然後用-c將那些換行符分隔的結果傳回grep,以使用相同的模式計算出現次數。

2

遞歸變種:

find . -type f -exec cat {} + | grep -c 'string' 
相關問題