我想检查某些给定文件是否包含来自 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
的输出中删除重复的单词。
Use
wc -linstead of
wc -wsince
grep -o` 在不同的行中打印匹配的词。
find ... -print0
是为了处理可能有空格的文件。
find ... -type f
是只检索文件,避免稍后检查 -f
。
我的第一个参数是包含给定单词的文件,其余是其他目录 我在其中搜索文件,其中至少包含 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
的输出中删除重复的单词。 Use
wc -linstead of
wc -wsince
grep -o` 在不同的行中打印匹配的词。find ... -print0
是为了处理可能有空格的文件。find ... -type f
是只检索文件,避免稍后检查-f
。