我有一个包含一些记录的文本文件。我有两个模式要验证,我想列出文件中不包含两个模式的所有行。如何使用grep
命令执行此操作?
我使用grep -v
尝试了一些事情,但似乎没有任何效果。
假设我的文本文件如下
1. qwer pattern1
yui
2.广告pattern2
asd
3. cczxczc
4. jkjk pattern2
adsda pattern1
我想仅列出第1,2和3行。
提前致谢。
答案 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
删除包含one
或two
或两者的所有行。
awk '!/one|two/' file
three
four
nine
答案 3 :(得分:0)
虽然基于标准工具的答案(awk
,grep
等)通常更简单,更直接,但如果您需要纯粹的bash解决方案,那么您可以这样做:
$ while IFS= read -r ln; do [[ $ln =~ pattern1 ]] && [[ $ln =~ pattern2 ]] && continue; printf "%s\n" "$ln"; done < test
1. qwerpattern1yui
2. adspattern2asd
3. cczxczc
$