grep - 列出不包含两种模式的所有行

时间:2014-01-20 17:24:40

标签: bash grep

我有一个包含一些记录的文本文件。我有两个模式要验证,我想列出文件中不包含两个模式的所有行。如何使用grep命令执行此操作? 我使用grep -v尝试了一些事情,但似乎没有任何效果。

假设我的文本文件如下 1. qwer pattern1 yui
2.广告pattern2 asd
3. cczxczc
4. jkjk pattern2 adsda pattern1

我想仅列出第1,2和3行。

提前致谢。

4 个答案:

答案 0 :(得分:9)

您可以使用:

grep -w -v -e "word1" -e "word2" file

或者使用egrep

egrep -w -v -e "word1|word2" file

更新:根据评论,似乎以下awk会更好用:

awk '!(/pattern1/ && /pattern2/)' file

答案 1 :(得分:3)

如果我正在跟进评论和编辑,我认为这就是你需要的:

$ grep -E -v 'pattern1.*pattern2|pattern2.*pattern1' test
1. qwerpattern1yui
2. adspattern2asd
3. cczxczc
$ 

答案 2 :(得分:2)

如果您想尝试awk

awk '!/pattern1|pattern2/' file

如果包含任何图案

,它将不会打印任何行

你也可以扩展这个:

awk '!/pattern1|pattern2|pattern3|pattern4/' file

实施例

cat file
one
two
three
four
one two
two
nine
six two

删除包含onetwo或两者的所有行。

awk '!/one|two/' file
three
four
nine

答案 3 :(得分:0)

虽然基于标准工具的答案(awkgrep等)通常更简单,更直接,但如果您需要纯粹的bash解决方案,那么您可以这样做:

$ while IFS= read -r ln; do [[ $ln =~ pattern1 ]] && [[ $ln =~ pattern2 ]] && continue; printf "%s\n" "$ln"; done < test 
1. qwerpattern1yui
2. adspattern2asd
3. cczxczc
$