[英]how to use && with grep in bash
我想檢查bash中是否存在文件中的多行。
為此,我使用了grep -q
,它僅適用於一行:
if grep -q string1 "/path/to/file";then
echo 'exists'
else
echo 'does not exist'
fi
我嘗試了多種組合的多種方式,例如:
if grep -q [ string1 ] && grep -q [ string2 ] "path/to/file";then
我也用-E
嘗試過:
grep -E 'pattern1' filename | grep -E 'pattern2'
但似乎沒有任何效果。 有任何想法嗎?
您可以使用以下gnu-awk
命令來斷言文件中是否存在多個字符串,而不是運行多個grep
命令:
awk -v RS='\\Z' '/string1/ && /string2/ && /string3/{e=1} END{exit !e}' file &&
echo 'exists' || echo 'does not exist'
RS=\\Z
將使awk在單個記錄分隔符中讀取所有輸入 &&
將確保所有搜索詞都存在於輸入文件中 exists
只有當所有3個搜索項存在於輸入文件。 您可以這樣做:
if grep -q 'string1' /path/to/file; then
if grep -q 'string2' /path/to/file; then
echo exists
else
echo 'does not exist'
else
echo 'does not exist'
fi
要么:
grep -q 'string1' /path/to/file &&
grep -q 'string2' /path/to/file &&
echo exists ||
echo 'does not exist'
您的問題有兩個歧義,但是假設您希望pattern_1和pattern_2存在於文件中(不在同一行中),則可以執行此操作。
for file in *; do
egrep -q pattern_1 $file && egrep -q pattern_2 $file && echo $file
done
使用grep -p
可以在同一行中匹配乘法模式:
grep -P '(?=.*string1)(?=.*string2)' file
上面將打印與string1
和string2
匹配的行。
(?=...)
是正向先行 ,它匹配某個模式而不是匹配的一部分。
然后-z
將處理整個文件:
% seq 1 100 | grep -qzP '(?=.*1)(?=.*5)'; echo $?
0
% seq 1 100 | grep -qzP '(?=.*1)(?=.*a)'; echo $?
1
由於@iruvar尚未發布他的評論作為答案,因此我將其放在此處:
grep -q string_1 file && grep -q string_2 file
現在,這是我的貢獻。 是@anubhava的計算復雜度更高的awk
答案,它只讀取一次文件,比@iruvar的簡單答案(讀取文件三倍)快嗎?
awk 11.730 s
grep && grep 0.258 s
沒有。
當然,這將取決於文件系統與cpu的速度以及進行多少緩存,但是在我的系統上(這可能是典型的B + / A-工作站), grep kw1 file && grep kw2 file && grep kw3 file
是速度是@anubhava的awk
解決方案的約50倍。 這在SSD和主軸突襲上均適用。 (詳見:測試文件是500萬線,160M,並且有kw1
在第一行上, kw2
在2.5百萬分之一,並kw3
上第五百萬。)
可以進行一些簡單的優化,例如,如果您可以通過匹配整行來解決問題,則可以這樣做(使用grep -x
); 在這種情況下,速度是以前的兩倍。
對於許多(例如,> 1,000個)文件,使用grep -l
和xargs
更快:
grep -l kw1 *.txt | xargs grep -l kw2 | xargs grep -q kw3
與循環相反:
for f in *.txt; do
grep -q kw1 $f && grep -q kw2 $f && grep -q kw3 $f
done
使用相同的測試文件grep -l | xargs grep
grep -l | xargs grep
花費了0.258秒,就像grep && grep
。 有兩個測試文件,它仍然沒有比grep && grep
快。 grep -l | xargs grep
包含2000個測試文件,每個測試文件5,000行,其中沒有任何匹配項grep -l | xargs grep
grep -l | xargs grep
速度是grep && grep
10倍。
您可以使用“ -q”來使用grep進行搜索
if grep -q string1 "/path/to/file" && grep -q string2 "/path/to/file";then
echo 'exists'
else
echo 'does not exist'
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.