如何在bash脚本中使用管道运行此grep命令?
$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 :(得分: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
答案 1 :(得分: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
第三次时间限制包含$subject
行的条目。
如果用户($email
)超过配额,为什么不保留status=sent
的限制,并将其作为count
个超过配额的邮件?这样做,您只需使用pipe
(小写wc -l
)而不是剪切,第二和第三L
来消除除grep
之外的所有grep "$email.*status=sent" mail.log | wc -l
:
$subject
如果您确实需要$subject
限制,请发布日志片段,其中显示条目中包含xxxxx@xxxx.xx
行的方式。 (您可以grep "$subject.*status=sent" mail.log | grep "$email" | wc -l
每个地址等。)为了限制唯一用户的超额配额消息,它将类似于:
"status=sent.*$subject"
注意:您可能需要将第一个grep中查询的顺序切换为{{1}},具体取决于条目的显示方式。 (这就是为什么我们需要看一个片段)