如何使用grep在一行中找到两个术语/字符串?
只有在找到两个术语/字符串后才能生成输出或日志文件中的条目
我做了以下尝试:
egrep -n --color '(string1.*string2)' debuglog.log
在此示例中,标记了两个字符串之间的所有内容
但我希望看到只有两个标记的字符串
这可能吗?
也许你可以用另一种工具做到这一点,我愿意接受建议。
答案 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
但因打印重叠匹配而失败。