2014-11-20 99 views
1

我想知道是否有一個班輪正在做我在找什麼,或者如果我必須寫一個bash腳本。我正在尋找的是在目錄中遞歸搜索,如果找到的字符串被找到,那麼搜索同一個文件以獲得另一個字符串並將其打印到屏幕上。因此,在這個例子中,我想知道「X-Spam-Status」標題的分數是否在電子郵件範圍內,如果是,則打印出該電子郵件中的發件人或主題標題。使用grep找到文本,如果在文件中找到echo那個文件中的另一個字符串

實施例:

我使用的命令是:

grep 'X-Spam-Status: .* score=[5-9]\.' /var/email/example.com/example/cur/* | wc -l 

這裏是我需要定位在這些信息的報頭:如果grep的發現在一個匹配

X-Spam-Status: No, score=6.5 required=5.0 tests=HTML_MESSAGE, 
     RCVD_IN_DNSWL_NONE,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham version=3.3.2 

上面的頭部,從同一封電子郵件中查找並回顯此標頭:

From: "From the Desk of Allen Watson" <[email protected]> 
Subject: Don't Live in Fear of Loud Noises 

它可以是主題或來源。它不一定是兩者兼而有之。

回答

1

該溶液首先使用一個查找,其中有一個文件過濾器。 爲了確保正確處理文件名中的空格,使用開關-print0創建空終止文件名列表。

xargs使用此列表將參數傳遞給grep命令,該命令也會輸出空終止線。你可以使用盡可能多的xargs grep組合。

如果要讀取輸出,則管道中的最後一個命令不帶-Z。在我們的例子中,我只使用了head -2來輸出文件的前兩行。

function grep2strings_recursive() { 
    if [ '0' = "$#" ]; then 
     echo "Usage: $FUNCNAME <dir> <string1> <string2>" 
     return 
    fi 
    find "$1" -type f -print0 | xargs -0 grep -lZ "$2" | xargs -0 grep -lZ "$3" | xargs -0 head -2 
} 

grep2strings_recursive '/var/email/example.com/example/cur' 'X-Spam-Status: .* score=[5-9]\.' 'From' 

它使用零輸出終止(-print0和-Z)和空輸入終止(-0),以確保在空間/標籤/換行符字符的情況下正確的行爲是非常重要的文件名。

+0

這就是我一直在尋找的東西。我可以通過在'if'語句之後將所有內容添加到'find'命令來創建它作爲一個班輪。輸出格式也很好。謝謝。還有一件事我試圖讓「X-Spam-Status」的值被回顯,而不是文件名。我該怎麼做呢?我關心的唯一信息是'Score'值和'From'值 – Yamaha32088 2014-11-20 17:57:09

+1

,而不是'head -2',只是使用'egrep -h'^(From | X-Spam-Status)'' - 如果這是不是你所期望的,請發佈一個示例輸出。 – 2014-11-20 20:15:45

1

像這樣的東西?

find /path/to/files -type f | xargs -i grep "searchterm" {} | grep -o "othersearchterm" 

find /path/to/files -type f | xargs -i grep "X-Spam-Status" {} | egrep -o '(From|Subject).*' 
+0

這沒有修改就無法正常工作。我最終通過遵循'lx42.de'的答案將它作爲一個班輪工作,並在'if'語句之後基本上將其刪除到'find'命令。 – Yamaha32088 2014-11-20 17:54:05

相關問題