使用grep打印其中一个列出的字符串,但如果存在多个字符串则打印所有字符串

时间:2015-04-12 16:49:31

标签: regex terminal grep osx-yosemite

我在文件中搜索了三个字符串。要找到其中任何一行的行,我使用

grep 'string1\|string2\|string3' file

我想使用-o标记仅打印每行中匹配的字符串。但是在这种情况下,如果该行中存在两个字符串,则只显示其中一个字符串。有没有办法获得string1和/或string2之类的内容,而无需使用和this answer列出6个案例。

请注意,我使用的是OS X Yosemite。

预期产出:

string1
string1 string2
string3
string1 string3
string3

2 个答案:

答案 0 :(得分:1)

最后你有一个额外的尾随\|,试试

grep -o 'string1\|string2\|string3' file
string1
string1
string2
string3
string1
string3
string3

编辑:您可以将此grep与gnu-awk一起使用:

grep -no 'string1\|string2\|string3' file | awk -v RS='[0-9]+:' 'NR>1{
      gsub(/\n/, "\t"); print}'

答案 1 :(得分:1)

您可以尝试打印行号,重复记录 没有行号。然后加入后处理行。

grep -Eon 'string1|string2|string3' txt 

1:string1
2:string2
string3
3:string3
4:string1
string2

在上述情况下,2:string2string3可以加入string2 string3

在Mac OS上完成命令

 grep -Eon 'string1|string2|string3' txt | tr  '\n' ' ' 
 | sed -E 's/ [0-9]:/:/g' | tr ':' '\n'

最后tr& sed命令可以用单sed命令替换。但不知何故,新行字符无法在Mac上运行。

输出类似于此

string1
string2 string3
string3
string1 string2 string3