簡體   English   中英

如何在bash中與grep一起使用&&

[英]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

上面將打印與string1string2匹配的行。

(?=...)正向先行 ,它匹配某個模式而不是匹配的一部分。

然后-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 -lxargs更快:

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.

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