如何在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」
如何在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」
試試這個:
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
對不起,我沒有把自己弄清楚,我想在bash腳本中運行這段代碼,我想把這個返回值捕獲到一個變量中。 – 2014-10-11 07:43:22
我現在在bash腳本中試了這個,它的工作原理是:複製上面的代碼 – 2014-10-11 07:47:17
它工作!謝謝 – 2014-10-11 07:56:56
這是一個有點不清楚爲什麼你正試圖在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"
。 (這就是爲什麼我們需要看到一個片段)
我想檢查一個電子郵件是否與同一主題發送。 – 2014-10-11 08:18:40
我明白,我只是看着它,並認爲它可以比'grep,grep,cut,grep'更有效率。 – 2014-10-11 08:22:16
+1不回答實際問題(只是不好的語句!),但是爲了回答更爲重要的問題,這個問題是關於爲什麼這麼複雜的管道和給出更優雅的答案。 – 2014-10-11 08:27:25
$ subject在哪裏?什麼是$(grep?) – 2014-10-11 07:33:01
當你將這段代碼複製到bash腳本中時,你得到的錯誤是什麼? – 2014-10-11 07:33:16
最後一個字符不是「。這就是問題所在。請參閱下面的答案。它已經過測試並且工作正常 – 2014-10-11 07:34:26