【问题标题】:print lines that don't match array elements打印与数组元素不匹配的行
【发布时间】:2020-10-03 18:32:50
【问题描述】:

我有一个数组

arr=( 'error one' 'error two' 'error three' )

还有一个我想找出错误的文件

a.txt

带有内容(示例)。

error one
error two
error three
error four
error five
error six
error seven
eight
nine
ten

当我运行我的脚本时,我想忽略我已经找到的所有错误(数组中的错误)并找到新的错误。

到目前为止我有这个

arr=( 'error one' 'error two' 'error three' )
grep -v 'error one\|error two\|error three' a.txt | grep error

返回 this(正确)。

error four
error five
error six
error seven

不过,数组的内容会随着时间的推移而变化,这取决于我发现的更多错误,或者我停止发现的错误,我更愿意将数组作为一个整体来引用,而不是列出每个项目。

到目前为止,我有这样的东西。

arr=( 'error one' 'error two' 'error three' )
function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }
list=$(join_by "\|" "${arr[@]}")
echo ${list}
grep -v ${list} a.txt | grep error

这当然行不通,但我不知道如何从这里着手,或者是否要完全改变方法。

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays bash grep


    【解决方案1】:

    您不必通过\| 加入模式,grep 也接受换行符分隔的列表。所以你可以简单地做:

    grep -v "$(printf '%s\n' "${arr[@]}")" a.txt | grep error
    

    概念证明:

    $ arr=(2 4)
    $ seq 4 | grep -v "$(printf '%s\n' "${arr[@]}")"
    1
    3
    

    【讨论】:

      【解决方案2】:

      grep 可以使用-f 从文件中读取模式,每行一个,您可以使用printf 使数组元素每行显示一个:

      grep -v -f <(printf '%s\n' "${arr[@]}") a.txt | grep error
      

      【讨论】:

      • 如果数组应该有很多元素,那么我会先反转命令以删除不必要的行:grep error a.txt | grep -v -f &lt;(printf '%s\n' "${arr[@]}")
      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多