2010-07-20 57 views
7

我有一些數據文件,這基本上都坐格式慶典找到鏈接到的grep,然後打印

索引文件的一系列索引文件:asdfg.log.1234.2345.index

數據文件:asdfg的.log

的想法是做搜索的所有索引文件。如果值XXXX出現在一個索引文件中,請去grep其相應的數據文件並在數據文件中打印XXXX出現的那一行。

到目前爲止,我可以簡單地在索引文件中搜索值XXXX,例如

find . -name "*.index" | xargs grep "XXXX"  // Gives me a list of the index files with XXXX in them 

如何使索引文件匹配,然後grep其相應的數據文件?

回答

3

這是否有訣竅?

find . -name '*.index' | 
xargs grep -l "XXXX" | 
sed 's/\.log\.*/.log/' | 
xargs grep "XXXX" 

find命令來自你的例子。第一個xargs grep只列出(索引)文件名。 sed將文件名映射到數據文件名。第二個xargs grep然後掃描數據文件。

您可能需要插入sed步驟之後sort -u一步。

+0

謝謝喬納森 - 多數民衆贊成在我以後的初始sed沒有完全,所以我把它換了。感謝壽 SED的/ \。登錄。* /日誌/' – wmitchell 2010-07-20 14:22:24

+0

如果你的文件被稱爲與空間名稱這將會失敗,「或」,要知道爲什麼http://en.wikipedia.org/wiki/ Xargs#The_separator_problem 使用GNU Parallel http://www.gnu.org/software/parallel/分隔符問題僅限於包含\ n的文件名\ n。 find。-name'* .index'| parallel grep -l 「XXXX」| sed's/\。log \。* /。log /'| sort -u | parallel grep「XXXX」 在http://www.youtube上觀看GNU Parallel的介紹視頻。 com/watch?v = OpaiGYxkSuQ – 2010-08-01 14:02:51

+0

@Ole:同意這會在文件名中對空格,換行符等進行犯規 - 然而,這個問題是在一個假設沒有這種複雜性的前提下提出的(它使用簡單的'find',而不是'find ... -print0',它使用普通的'xargs'而不是'xargs -0'),所以給出的答案適用於相同的環境。 – 2010-08-01 14:34:25

0
grep -l "XXXX" *.index | while read -r FOUND 
do 
    if [ -f "${FOUND%.log*}log" ];then 
     grep "XXXX" "$FOUND" 
    fi 
done