如何使用grep匹配同一行中的两个字符串

时间:2018-03-06 14:41:12

标签: string bash grep

如何使用grep在一行中找到两个术语/字符串?
只有在找到两个术语/字符串后才能生成输出或日志文件中的条目 我做了以下尝试:

egrep -n --color '(string1.*string2)' debuglog.log

在此示例中,标记了两个字符串之间的所有内容 但我希望看到只有两个标记的字符串 这可能吗?
也许你可以用另一种工具做到这一点,我愿意接受建议。

4 个答案:

答案 0 :(得分:3)

最简单的解决方案是首先只选择包含两个字符串的行然后grep两次为匹配着色,例如:

egrep 'string1.*string2|string2.*string1' |
    egrep -n --color=always 'string1' | egrep --color 'string2'

将颜色设置为always很重要,否则grep不会将颜色信息输出到管道。

答案 1 :(得分:2)

这是单一命令awk解决方案,它使用颜色代码为匹配的字符串添加前缀和后缀:

awk '/string1.*string2/{
gsub(/string1|string2/, "\033[01;31m\033[K&\033[m"); print}' file

答案 2 :(得分:1)

我知道有些人不同意,但我认为最好的办法是这样做:

让我们说这是你的意见:

$ cat > fruits.txt
apple banana
orange strawberry
coconut watermelon
apple peach

使用此代码,您可以准确地获得所需内容,并且代码看起来更好更清洁:

awk '{ if ( $0 ~ /apple/ && $0 ~ /banana/ ) 
       { 
         print $0
       } 
    }' fruits.txt

但是,正如我之前所说,有些人会因为打字太多而不同意。使用grep的简短方法只是连接许多 greps ,例如:

grep 'apple' fruits.txt | grep 'banana'

问候!

答案 3 :(得分:0)

由于没有样本数据或预期输出,我对你真正想要的东西感到有些困惑,但是:

$ cat foo
1
2
12
21
132
13

打印记录匹配部分的awk:

$ awk '
/1/ && /2/ {
    while(match($0,/1|2/)) {
        b=b substr($0,RSTART,RLENGTH)
        $0=substr($0,RSTART+RLENGTH)
    }
    print b
    b=""
}' foo
12
21
12

但因打印重叠匹配而失败。