unix 使用grep打印不匹配的模式,而不是文件的不匹配内容

ssgvzors  于 2023-01-17  发布在  Unix
关注(0)|答案(3)|浏览(199)

我在bash中使用grep命令查找多个未找到匹配项的关键字/模式
例如,下面的命令返回匹配的关键字/模式
grep -oehE '(目录|制动爪|苹果|芒果| bat )'温度. txt|分类|独特的
但我正在寻找一个命令,可以做以下:

temp.txt contains
This is a dog the best
Dog are the best
doG
dog
My best buddy is dog
Love mango and candy

我要查找的搜索输出为

cat 
apple
bat

输出是与文件中的数据不匹配的模式。
我搜索了一个类似的问题,我能找到的最接近的是下面的帖子,但它处理的是文件,而不是命令行上的所有内容
Similar problem using file
任何帮助都很感激。

km0tfn4u

km0tfn4u1#

使用awk,您可以:

$ awk -v p="cat|dog|apple|mango|bat" '  # search words
BEGIN {                                 # first make hash of the search words
    split(p,t,/\|/)
    for(i in t)
        a[t[i]]
}
{
    for(i=1;i<=NF;i++)                   # for each record and word in the record
        delete a[$i]                     # remove them from the hash
}
END {                                    # in the end
    for(i in a)                          # in order that appears random
        print i                          # output the leftovers
}' temp.txt

并且具有以下输出:

bat
apple
cat

使用grep

$ echo "cat|dog|apple|mango|bat" | tr \| \\n > pats
$ grep -vf temp.txt pats
cat
apple
bat

使用grep,不涉及文件:

$ echo -e cat\\ndog\\napple\\nmango\\nbat | grep -vf temp
cat
apple
bat
nwlqm0z1

nwlqm0z12#

为了好玩,如果你只有单词(所以不需要处理空格和特殊字符),而且单词很少(在命令行的限制下),你可以使用和检查单词一样多的grep调用

for p in cat dog apple mango bat; do grep -qsw "$p" temp.txt || echo "$p"; done

在这里,如果在文件中找不到每个单词,则回显。
无论如何,awk替代方案更好,因为您不会多次生成进程。

mf98qq94

mf98qq943#

这并不能保证排序规则的顺序,因此如果需要,您必须手动执行sort

mawk -v RS='[[:space:]]+' '
       {  __[$_]
 } END {     FS = "|"
             $_ = ___
         for (_ = +_; _++ < NF; _++) { 
            if ( ! ( $_ in __ ) ) { 
               print $_           } } }' ___='cat|dog|apple|mango|bat'
cat
apple
bat

相关问题