我想检查某些给定文件是否包含来自 shell 脚本中输入文件的 3 个以上的单词

I want to check if some given files contain more then 3 words from an input file in a shell script

我的第一个参数是包含给定单词的文件,其余是其他目录 我在其中搜索文件,其中至少包含 3 个来自 第一个参数

的单词

我可以成功打印出匹配词的数量,但是当测试时如果它大于3 它给了我 error: test: too many arguments

这是我的代码:

#!/bin/bash

file=
shift 1

for i in $*
do
    for j in `find $i`
    do
        if test -f "$j"
        then
            if test grep -o -w "`cat $file`" $j | wc -w -ge 3
            then
                echo $j
            fi
        fi
    done


done

您首先需要执行grep | wc,然后将该输出与 3 进行比较。您需要为此更改 if 语句。由于您已经在使用反引号,因此无法嵌套它们,因此您可以使用其他语法 $(command),它等同于 `command`:

if [ $(grep -o -w "`cat $file`" $j | wc -w) -ge 3 ]
then
    echo $j
fi

我认为您的问题是您试图获取 grep -o -w "cat $file" $j | wc -w 的结果以查看它是否大于或等于三,但您的语法不正确。试试这个:

 if test $(grep -o -w "`cat $file`" $j | wc -w) -ge 3

通过将 grep 和 wc 命令放入 $(),shell 执行这些命令并使用输出而不是命令本身的文本。考虑一下:

> cat words
western
found
better
remember

> echo "cat words | wc -w"
cat words | wc -w

> echo $(cat words | wc -w)
4

> echo "cat words | wc -w gives you $(cat words | wc -w)"
cat words | wc -w gives you 4

> 

请注意,$() 语法等同于您已经在 cat $file 命令中使用的双反引号表示法。

希望对您有所帮助!

您的代码可以在几个地方进行重构和更正。

这样说:

#!/bin/bash

input=""
shift

for dir; do
    while IFS= read -r d '' file; do
         if [[ $(grep -woFf "$input" "$file" | sort -u | wc -l) -ge 3 ]]; then
             echo "$file"
         fi
    done < <(find "$dir" -type f -print0)
done
  • for dir 遍历所有参数
  • 使用 sort -u 是为了从 grep 的输出中删除重复的单词。
  • Usewc -linstead ofwc -wsincegrep -o` 在不同的行中打印匹配的词。
  • find ... -print0 是为了处理可能有空格的文件。
  • find ... -type f 是只检索文件,避免稍后检查 -f