在bash中的另一个字符串后面提取字符串?

时间:2013-02-08 09:19:16

标签: linux bash grep design-patterns

我有以下字符串:

  

[1360308597]服务通知:qreda; demo-jms2; OutConnectorResponse; notify-service-by-email; CRITICAL ConsumerCount = 0 [1360308817]服务通知:qreda; demo-jms2;磁盘空间; CRITICAL;通知服务 - 电子邮件; DISK CRITICAL - 免费空间:/ data 3018 MB(10%inode = 92%):

在上面的字符串中,我想提取demo-jms2之后的字符串。这里demo-jms2出现两次。我希望得到demo-jms2之后的所有单词,所以答案应该是 OutConnectorResponseDisk Space

1 个答案:

答案 0 :(得分:3)

你想要的是positive look-behind

$ grep -Po '(?<=demo-jms2;)[^;]+' file
OutConnectorResponse
Disk Space

选项:

  

-P, - perl-regexp PATTERN是一个Perl正则表达式

     

-o, - only-matching仅显示匹配PATTERN

的行的部分

说明:

(?<=demo-jms2;) # Positive lookbehind: match the follow after literal demo-jms2;
[^;]+           # Match one or more non ; characters 

修改

通过sort -u过滤结果管道中的重复项:

$ grep -Po '(?<=demo-jms2;)[^;]+' file 
OutConnectorResponse
Disk Space
OutConnectorResponse
Disk Space

$ grep -Po '(?<=demo-jms2;)[^;]+' file | sort -u
Disk Space
OutConnectorResponse