我怎样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包含在第二行的时间戳中..
答案 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