在shell中运行带引号的命令

时间:2014-10-11 07:16:13

标签: bash sh

如何在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” 

2 个答案:

答案 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}},具体取决于条目的显示方式。 (这就是为什么我们需要看一个片段)