2015-06-01 49 views
0

我有一個要求打印包含文本的所有文件名和行號。找到並grep並打印文件名和行號

find . -name '*.cpp' -exec grep -n 'HELLO' {} \; > output.txt 

但它只打印內容和行號而不是文件名。如何實現它?我正在Solaris上做。

+0

你想要的內容,還是隻有文件名? –

+0

只有行號和文件名。 – CrazyC

+0

您是否需要遞歸搜索,或者是當前目錄中的所有文件? –

回答

0

你需要一個更grep的說法:

-H, --with-filename 
      Print the filename for each match. 

我沒有看到一個方法來排除在grep的輸出匹配的文本。您可能需要再次過濾輸出。

+1

不幸的是,這是一個非標準選項,因此可能無法使用。 –

+0

solaris'grep支持那些參數? – 1010

0

你爲什麼不使用的 「grep」 「-r」 選項,查找裏面的文件:

find . -name '*.cpp' -exec awk '/HELLO/ { print FILENAME, NR }' {} + > output.txt 

每當:

find . -name '*.cpp' | grep -n -r HELLO > output.txt 
+0

這將grep發現的輸出(即,一個文件名列表) – 1010

+0

grep將打開並查找路徑與「找到」找到的文件內。這是「-r」提供的選項。 –

+0

如果您使用文件列表執行grep,情況就是如此。在這種情況下,你將管道find的輸出轉換爲grep,所以grep將處理它的標準輸入。 – 1010

4

這裏使用的AWK代替grep的一個選項該模式被匹配,文件名和行號被打印出來。我已經使用了-exec {} +,以便多個文件名作爲參數傳遞給awk的單個調用,如果您有大量要搜索的文件,這應該會更快。

1

如果您的grep不支持-H選項(Solaris 10上的greps不支持),典型的解決方法是將文件/dev/null添加到grep的命令行中。該文件不會匹配任何內容,但由於命令行中有兩個或更多文件,因此grep將在其輸出中顯示文件名。

find . -name '*.cpp' -exec grep -n 'HELLO' /dev/null {} \; > output.txt 
0

你可以嘗試

grep -n 'HELLO' `find . -name '*.cpp'` > output.txt 

我無法測試它在Solaris上,所以我不知道它會工作。

0

讓grep查找2個文件。我通常使用/ etc/passwd,但/ dev/null更好:

find . -name '*.cpp' -exec grep -n 'HELLO' {} /dev/null \; > output.txt 
相關問題