簡體   English   中英

Linux grep,如何顯示不包含單詞 1 和單詞 2 的行但仍顯示包含兩個單詞的行

[英]Linux grep, how can I display lines that don't contain word 1 and word 2 but still display the lines that have both words in them

我需要一些幫助來顯示所有不包含word1word2的行,但必須顯示包含這兩個行的行。

例子:

aaaa bbbb cccc
bbbb bbbb bbbb
cccc cccc cccc
dddd dddd aaaa

如果word1 = aaaaword2 = bbbb那么 output 應該是:

aaaa bbbb cccc
cccc cccc cccc

試過了

grep -Ewv "word1/word2" file.txt 

但這僅顯示不包含它們的行,它不顯示包含兩者的行

我需要用 grep 命令來做這個,忘了提這個

Grep 版本兩者都有或都沒有:

grep -v -P '((?=.*aaaa)(?!.*bbbb))|((?=.*bbbb)(?!.*aaaa))'

但請不要在這種情況下使用grep 消極和積極的展望很容易導致災難性的回溯

GNU grep知道 Perl 兼容正則表達式 (PCRE) 語法(選項-P )。 這個東西仍然被稱為“正則”表達式,盡管它不再是正則表達式了。 其他人更明確,稱回溯不規則表達式。

這個怎么運作:

(?=.*aaaa)匹配行中任意位置的aaaa ,但不移動 cursor。 匹配后,下一次搜索從行首開始。

(?..*bbbb)匹配行中沒有bbbb並且也不移動 cursor。

兩者一起匹配包含aaaa但不包含bbbb的行。

這是您要從搜索結果中排除的情況之一。 or 條件 ( | ) 后面的第二個是您要排除的另一個:沒有aaaa的任何bbbb

通過以上內容,您已經定義了您不想要的內容。 接下來使用-v反轉搜索以獲得您想要的內容。

預期輸出

Bash 兩個版本或一個都沒有:

#! /bin/bash

word1=${1:-aaaa}
word2=${2:-bbbb}

while read -r line; do
  if [[ $line =~ $word1 ]]; then
    if [[ $line =~ $word2 ]]; then
      printf "%s\n" "$line"
    fi
  else
    if [[ $line =~ $word2 ]]; then
      :
    else
      printf "%s\n" "$line"
    fi
  fi
done

在我看來,最簡單的方法(即使可能不是最快的方法)是分別查找不包含任何單詞的行和包含兩個單詞的行,並將結果連接起來。 例如(假設file.txt是目錄test中的一個文本文件,我將輸入值作為環境變量傳遞給一般性 - 我們只尋找完整的單詞,而不是單詞片段):

[mathguy@localhost test]$ more file.txt
aaaa bbbb cccc
bbbb bbbb bbbb
cccc cccc cccc
dddd dddd aaaa



[mathguy@localhost test]$ word1=aaaa
[mathguy@localhost test]$ word2=bbbb

[mathguy@localhost test]$ ( grep "\b$word1\b" file.txt | grep "\b$word2\b" ; \
>  grep -v "\b$word1\b" file.txt | grep -v "\b$word2\b" ) | cat
aaaa bbbb cccc
cccc cccc cccc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM