1

我想以任何顺序 grep 包含两种模式的行并且我正在使用

awk '/pattern1/ && /pattern2/' file.txt

但是如果我想做不区分大小写的搜索,添加 /i 只有在我将它添加到 pattern2 时才有效。

awk '/pattern1/ && /pattern2/i' file.txt ...works

awk '/pattern1/i && /pattern2/i' file.txt ...don't, outputs the whole file

有谁知道如何解决这个问题?

4

4 回答 4

4

尝试:

awk '{s=tolower($0)} s~/lowercase_pattern1/ && s~/lowercase_pattern2/' file

IGNORECASEGNU awk中也有该选项的可能性。


你也可以在大多数时候做这样的事情:

grep -Ei 'pattern1.*pattern2|pattern2.*pattern1' file
于 2013-03-13T08:01:31.940 回答
2

awk '/pattern1/ && /pattern2/i' file.txt 将忽略模式/pattern2/

如果您想完全忽略这种情况,请添加IGNORECASE = 1.

IE。

awk 'BEGIN {IGNORECASE = 1} /pattern1/ && /pattern2/' file.txt

于 2014-10-17T09:16:49.753 回答
2

你也可以使用grep

grep -i "pattern1" file.txt | grep -i "pattern2.txt"

虽然它不会像使用两次通过来查找线条那样有效。

您可以使用sedwhich 可以一次性完成:

sed '/pattern1/I!d;/pattern2/I!d/' file.txt
于 2013-03-13T08:24:39.160 回答
1

只需将您的命令更改为:

awk 'tolower($0)~/pattern1/ && tolower($0)~/pattern2/' your_file

或者,您可以使用 perl:

perl -lne 'print if(/pattern1/i and /pattern2/i)' your_file
于 2013-03-13T09:17:42.463 回答