Grep与数字

时间:2013-02-14 10:34:38

标签: bash grep design-patterns

我怎样grep可以带号码。我有以下数据

[240465] SERVICE ALERT: localhost;demo-jms2:Critical Services;CRITICAL;SOFT;2;Disk Space,OutConnectorResponse-MCASMS,OutConnectorResponse-SPONSORED-SMS,
[240465] SERVICE EVENT HANDLER: localhost;demo-jms2:Critical Services;CRITICAL;SOFT;1;notify-service-by-email

我希望grep这个数据的数字为'2',这是'SOFT'之后的参数。在这里我的问题是当我用2 grep时,我得到两行,因为2包含在第二行的时间戳中..

5 个答案:

答案 0 :(得分:2)

已经有很多答案建议您对grep表达式进行修复。如果您以交互方式处理问题,那么这是正确的做法,而现在缩小结果的快速黑客就足够了。

如果您正在编写脚本,我建议使用类似awk命令的内容:

awk -F';' '{if ($5==2) print}'

或者@sudo_O在评论中提供的更具可读性的等价物:

awk -F';' '$5==2'

首先,我们必须从您的示例中重新构建您想要的规范。您可以可靠地完成它,但它看起来就像您想要在分号分隔字段的第五个字段中找到2一样。这就是上面命令的作用。

答案 1 :(得分:1)

只需使用模式;2;

即可
$ grep ';2;' file
[240465] SERVICE ALERT: localhost;demo-jms2:Critical Services;CRITICAL;SOFT;2;...

或者,如果您只想在2之后匹配SOFT,请使用;SOFT;2;

$ grep ';SOFT;2;' file
[240465] SERVICE ALERT: localhost;demo-jms2:Critical Services;CRITICAL;SOFT;2;...

答案 2 :(得分:0)

Grep有更多背景:

 grep "SOFT;2;" data

记住引号,否则“;”将被shell解释。

答案 3 :(得分:0)

尝试这样做:

grep 'SERVICE.*ALERT.*SOFT;2' file

我为unicity添加了更多模式。

答案 4 :(得分:0)

grep -Po "(?<=SOFT;)\d+"

包含您的数据

kent$  echo "[240465] SERVICE ALERT: localhost;demo-jms2:Critical 
Services;CRITICAL;SOFT;2;Disk Space,OutConnectorResponse-MCASMS,OutConnectorResponse-SPONSORED-SMS,
[240465] SERVICE EVENT HANDLER: localhost;demo-jms2:Critical Services;CRITICAL;SOFT;1;notify-service-by-email"|grep -Po "(?<=SOFT;)\d+"
2
1