2015-03-02 49 views
0

我想提取電子郵件標頭值,如郵件ID使用可變

grep的不正確地使用以前的變量...

這裏是我的代碼:

for email in $1/*.eml 
do 

MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}') 
M=$(echo "\""${MSGID}"\"") 
SRV="/var/log/maillog" 
echo "${M}" 

VER=$(grep -i ${M} ${SRV} | tail -n 1) 
echo ${VER} 
done 

我想用M變量重新包裝初始變量MSGID;不幸的是,我仍然無法弄清楚。

初始值(輸入)看起來是這樣的:

Message-ID: <[email protected]> 

MSGID只保留爲字符串:

<[email protected]> 

然後,我想用這個字符串反對使用grep文件。不幸的是,VER命令不會觸發任何東西。

我認爲添加"\""${MSGID}"\""會/應該保持初始字符串不變。

+0

此腳本中有很多冗餘步驟。請[編輯]您的問題以提供您的輸入樣本和所需的輸出。 – 2015-03-02 11:53:07

+0

請顯示一些輸入文件以及您的預期輸出。也許不值得讓你的當前腳本成爲開始,因爲例如'awk'可以以一種直接的方式處理它。 – fedorqui 2015-03-02 11:54:02

+0

可能'MSGID = $ awk'/^Message-ID:/ {print $ 2}'file)'會更快。另外,注意'SRV'可以在'for'循環之外聲明,因爲它是一個固定值。 – fedorqui 2015-03-02 12:18:09

回答

0

嘗試這種解決方案

M="\""$MSGID"\"" 
2

這真不明白你正在嘗試什麼來完成,只是去掉怪異的東西,簡化爲一個腳本,它可以幫助你完成你的任務。

SRV="/var/log/maillog" 
for email in $1/*.eml; do 
    M=$(awk 'tolower($0) ~ /message-id:/ {print $2}' "$email") 
    echo "$M" 
    grep -i "$M" "$SRV" | tail -n 1 
done 

這有一些有問題的角落案例。郵件ID提取大概應該是嚴格的:

M=$(awk 'tolower($1) ~ /^message-id:/ { print $2 } /^$/ { exit(0) }' "$email") 

,如果所提取的消息ID包含正則表達式元字符,你應該逃避他們,或者用正確的grep標誌:

grep -iF "$M" "$SRV" | tail -n 1 

可以肯定的,grep "$string" file中的雙引號不是grep語法的一部分;它們在grep運行之前被shell放棄,並且可用於防止shell在$string的值中混入空白和/或shell元字符。當你在另外一對雙引號中被強制使用時,你會在日誌文件中查找字面雙引號內的Message-id,並且(當然)找不到任何。

+1

我不知道'awk'中的'lc'()函數。小寫你可能想使用'tolower()'。注意你也可以在'BEGIN {}'塊中說'IGNORECASE = 1'。 – fedorqui 2015-03-02 12:22:11

+1

對,謝謝! – tripleee 2015-03-02 12:24:31

0

謝謝大家。對不起。

我發現我的初始值有回車符。

我已經改變了這個是這樣的:

MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}' tr -d '\r') 

再次感謝您。