![](/img/trans.png)
[英]How to GREP words, not lines, that contain specific characters, and print entire word
[英]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
我需要一些幫助來顯示所有不包含word1
或word2
的行,但必須顯示包含這兩個行的行。
例子:
aaaa bbbb cccc
bbbb bbbb bbbb
cccc cccc cccc
dddd dddd aaaa
如果word1 = aaaa
和word2 = 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.