如何使用&&用bash中的grep

时间:2016-06-03 19:39:21

标签: linux bash shell grep

我想检查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'

但似乎没有任何效果。有什么想法吗?

6 个答案:

答案 0 :(得分:3)

您可以使用此grep命令断言文件中存在多个字符串,而不是运行多个gnu-awk命令:

awk -v RS='\\Z' '/string1/ && /string2/ && /string3/{e=1} END{exit !e}' file &&
echo 'exists' || echo 'does not exist'
  • RS=\Z将使awk读取单个记录分隔符中的所有输入
  • 在多个搜索字词之间使用&&将确保输入文件中存在所有搜索字词
  • 仅当输入文件中存在所有3个搜索字词时,才会打印exists

答案 1 :(得分:1)

你可以这样做:

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'

答案 2 :(得分:1)

您的问题中存在一些含糊之处,但假设您希望pattern_1和pattern_2存在于文件中(不在同一行),那么您可以执行此操作。

for file in *; do
  egrep -q pattern_1 $file && egrep -q pattern_2 $file && echo $file
done

答案 3 :(得分:1)

使用grep -p,您可以匹配同一行中的多个模式:

grep -P '(?=.*string1)(?=.*string2)' file

以上内容将打印与string1string2匹配的行。

(?=...)是一个positive lookaheads,它匹配模式而不会使其成为匹配的一部分。

-z会淹没整个文件:

% seq 1 100 | grep -qzP '(?=.*1)(?=.*5)'; echo $?
0
% seq 1 100 | grep -qzP '(?=.*1)(?=.*a)'; echo $?
1

答案 4 :(得分: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是〜50x快速@ anubhava的awk解决方案。这在ssd和主轴突袭中都是正确的。 (详情:测试文件为5,000,000行,160M,第一行为kw1,第250万为kw2,第500万为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花了0.258秒,就像grep && grep一样。有两个测试文件,它仍然不比grep && grep快。 2000个测试文件各有5,000行,其中没有一个包含任何匹配项,grep -l | xargs grepgrep && grep快〜10倍。

答案 5 :(得分:0)

你可以使用“-q”来搜索grep

if  grep -q string1 "/path/to/file" &&  grep -q string2 "/path/to/file";then
      echo 'exists'
    else
      echo 'does not exist'
    fi