代码之家  ›  专栏  ›  技术社区  ›  totoro

检查文件是否包含字符串1 AND NOT字符串2

  •  1
  • totoro  · 技术社区  · 9 年前

    我有一个程序( prog )这需要很多时间来产生其输出。

    我需要检查输出是否包含 字符串1 而不是 字符串2 .

    现在我做以下事情。它调用 掠夺 2次。

    if   prog | grep -q 'some string' &&
       ! prog | grep -q 'another string'; then
        echo 'OK'
    else
        echo 'Not OK'
    fi
    

    是否有方法只调用1次 掠夺 ?

    涉及的任何解决方案 awk公司 sed标准 也可以。

    更新

    我所希望的是一句我脑子里看不到的话,让GNU coreutils为我所用。

    3 回复  |  直到 9 年前
        1
  •  3
  •   hek2mgl    9 年前

    我认为这是不可能的 grep 没有执行 prog 两次或更好,将其输出保存到临时文件中。

    我建议使用 awk :

    awk '/string1/{a=1}/string2/{b=1}END{exit !a && b}'
    

    您可以在shell脚本中使用它,如:

    if prog | awk '/string1/{a=1}/string2/{b=1}END{exit !a && b}' ; then
        echo "ok"
    else
        echo "not ok"
    fi
    

    注: awk公司 对待 0 为假,并且 1 事实如此。贝壳处理 0 是真实的,并且 1. 为false。为了反映我们回来了 !a && b 而不是 a && !b ,这可能首先看起来更合理。

        2
  •  2
  •   SLePort    9 年前

    使用sed,到满足要求的输出线:

    prog | sed -n ':a;$!N;s/\n//;ta;/string1/{/string2/!p}'
    

    更新:

    要测试sed命令(GNU sed):

    prog | sed -n ':a;$!N;s/\n//;ta;/string1/{/string2/!{q};/string2/{q 1}}' && echo "ok" || echo "nok"
    
        3
  •  1
  •   Mathews Jose    9 年前

    对于使用grep命令的问题:

    prog | grep -E 'string1|string2' | tr -d "\n" | grep  -v string2 | grep string1 && echo "OK" || echo "NOT OK"