如何使用grep在一行中查找两个术语/字符串?
只有在找到这两个术语/字符串时,才应输出或在日志文件中记录一个条目。
我尝试了以下方式:
egrep -n --color '(string1.*string2)' debuglog.log
在这个例子中,两个字符串之间的所有内容都被标记了。
但我只想看到找到的两个字符串被标记。
这可能吗?
也许你可以用另一个工具来实现,我很乐意听取建议。
如何使用grep在一行中查找两个术语/字符串?
只有在找到这两个术语/字符串时,才应输出或在日志文件中记录一个条目。
我尝试了以下方式:
egrep -n --color '(string1.*string2)' debuglog.log
最简单的解决方案是先选择只包含这两个字符串的行,然后使用两次grep命令着色匹配项,例如:
egrep 'string1.*string2|string2.*string1' |
egrep -n --color=always 'string1' | egrep --color 'string2'
设置颜色为always
非常重要,否则grep命令无法将颜色信息输出到管道中。
我知道有些人可能不同意,但我认为最好的方法是这样做:
假设这是你的输入:
$ 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'
问候!
awk '/apple/&&/banana/' file
- James Brown这里有一个单一命令awk
的解决方案,它会在匹配的字符串前缀和后缀添加颜色代码:
awk '/string1.*string2/{
gsub(/string1|string2/, "\033[01;31m\033[K&\033[m"); print}' file
我有点困惑你到底想要什么,因为没有提供样本数据或期望输出,但是:
$ 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
但是在打印重叠匹配项时失败。