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

4

如何使用grep在一行中查找两个术语/字符串?
只有在找到这两个术语/字符串时,才应输出或在日志文件中记录一个条目。
我尝试了以下方式:

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

在这个例子中,两个字符串之间的所有内容都被标记了。
但我只想看到找到的两个字符串被标记。
这可能吗?
也许你可以用另一个工具来实现,我很乐意听取建议。

2
不,这不是重复的问题。OP要求仅突出显示两个匹配字符串。对于一个字符串,可以使用“-o”选项来实现,但对于两个字符串则不行。 - iamauser
1
好的,我已经删除了重复内容。 - Cyrus
1
请使用awk,但请附上一些示例数据和预期输出。 - James Brown
1
这不是重复内容。 OP 不仅尝试匹配字符串,还要对它们进行颜色标记。在所引用的条目中没有找到答案。 - Dzienny
可能是重复的问题:如何使用grep匹配string1和string2? - jww
4个回答

3

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

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

设置颜色为always非常重要,否则grep命令无法将颜色信息输出到管道中。


2

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

假设这是你的输入:

$ 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'

问候!


1
这太费力了:awk '/apple/&&/banana/' file - James Brown
没错,这就是为什么我说这看起来更清晰。此外,你可以有一个单词数组来测试,使用 IF 结构实现更容易且更清晰。 - Matias Barrios

2

这里有一个单一命令awk的解决方案,它会在匹配的字符串前缀和后缀添加颜色代码:

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

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

但是在打印重叠匹配项时失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接