2014-10-11 82 views
0

如何在bash腳本中使用管道運行此grep命令?在shell中使用引號運行命令

$email is an email address 
$subject is a string "82\% Internet Quota Used\!" 

grep "$(grep "to=<$email.*status=sent" /var/log/mail.log | cut -d ":" -f 4)" /var/log/mail.log | grep -c "$subject」 
+0

$ subject在哪裏?什麼是$(grep?) – 2014-10-11 07:33:01

+0

當你將這段代碼複製到bash腳本中時,你得到的錯誤是什麼? – 2014-10-11 07:33:16

+0

最後一個字符不是「。這就是問題所在。請參閱下面的答案。它已經過測試並且工作正常 – 2014-10-11 07:34:26

回答

1

試試這個:

grep "$(grep "to=<$email.*status=sent" /var/log/mail.log | cut -d ":" -f 4)" /var/log/mail.log | grep -c '$subject' 

它工作在我的結束。 我的test.log如下所示。

test 

dsfs 
sd 
ds 
test 
asd 
asd 
testasdasd 

複製下面的代碼在一個文件中被稱爲test.sh並運行它作爲./test.sh

subject=test 
count=$(grep "$(grep "$subject" test.log | cut -d ":" -f 4)" test.log | grep -c "$subject") 

echo $count 

輸出:

Mayur:~ mayurnagekar$ ./test.sh 
3 
+0

對不起,我沒有把自己弄清楚,我想在bash腳本中運行這段代碼,我想把這個返回值捕獲到一個變量中。 – 2014-10-11 07:43:22

+0

我現在在bash腳本中試了這個,它的工作原理是:複製上面的代碼 – 2014-10-11 07:47:17

+0

它工作!謝謝 – 2014-10-11 07:56:56

1

這是一個有點不清楚爲什麼你正試圖在message-id上第二次grep,因爲它失去了限制爲sent消息的質量。例如,你收集發送message-id的有以下

grep "$email.*status=sent" mail.log | cut -d ":" -f 4 
C6625F3A4D 
E3868F3A5C 
20A2DF3A4D 
... 

然後您grep再次對每個message-id再次返回每個message-id失去限制含status=sent條目所有日誌條目。然後grep a 第3時間限制到包含您的$subject行的條目。

如果用戶($email)超過配額,爲什麼不保留status=sent的限制並提供您的count超過配額的郵件?這樣做,你可以簡單地使用wc -l(小寫L)消除所有,但一個pipe,而不是削減,第二和第三grep

grep "$email.*status=sent" mail.log | wc -l 

如果你真正需要的$subject限制,請張貼的片斷您的日誌顯示$subject行如何包含在條目中。 (你可以[email protected]每個地址等)要限制對超過配額的消息一個獨特的用戶,它會做類似:

grep "$subject.*status=sent" mail.log | grep "$email" | wc -l 

注:您可能需要切換的順序取決於條目的顯示方式,在第一個grep中查詢"status=sent.*$subject"。 (這就是爲什麼我們需要看到一個片段)

+0

我想檢查一個電子郵件是否與同一主題發送。 – 2014-10-11 08:18:40

+0

我明白,我只是看着它,並認爲它可以比'grep,grep,cut,grep'更有效率。 – 2014-10-11 08:22:16

+0

+1不回答實際問題(只是不好的語句!),但是爲了回答更爲重要的問題,這個問題是關於爲什麼這麼複雜的管道和給出更優雅的答案。 – 2014-10-11 08:27:25