在命令选择的多个文件中搜索短语

时间:2016-01-10 22:56:50

标签: bash shell

我希望这个脚本搜索“find”命令命名的每个文件,查找用户给出的这个短语,然后只显示找到短语的位置。
到目前为止,在将短语输入脚本后,它最终会说“grep:file:no such file or directory”。 这有什么不对?我是否错误地使用“for”?

#!/bin/bash

file=$(find ./ -mtime -7)
echo What phrase am I looking for:
read waldo
for f in file; 
do
 f=${f:5}
done
for p in file; 
do
 if grep -Fxq $waldo $p
then
 printf "Found phrase in " $p
fi
done

4 个答案:

答案 0 :(得分:2)

试试这个:(错过$ sigil on variable use)

#!/bin/bash

file=$(find ./ -mtime -7)
echo What phrase am I looking for:
read waldo
for f in file; do
  f=${f:5} # what's this ? not used after
done
for p in $file; do
  if grep -Fxq "$waldo" "$p"; then
    printf "Found phrase in $p\n"
  fi
done

使用更多报价!<​​/ p>

&#34;双引号&#34;每个包含空格/元字符和每个扩展的文字:"$var""$(command "$var")""${array[@]}""a & b"。使用'single quotes'代码或文字$'s: 'Costs $5 US'ssh host 'echo "$HOSTNAME"'。见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

答案 1 :(得分:1)

for f in file ; do

这将启动循环,迭代超过1个值:字符串file。如果您希望它迭代您之前创建的字符串,则必须使用

for f in $file; do

但是它会破坏包含空格的文件。最好使用-exec的{​​{1}}参数:

find

答案 2 :(得分:1)

这是我的解决方案

#!/bin/bash

file=$(find ./ -type f)
echo 'What phrase am I looking for:'
read waldo
for f in $file;
do
 if grep -Fq $waldo $f
 then
  echo "Found phrase in $f"
 fi
done

你错过了一些&#39; $&#39;在这里和那里,grep的-x标志只允许整行的匹配(不确定是否有意)也加入了&#39; -type f&#39;为了找到它,它不会尝试匹配文件夹。

您只需使用一个grep命令

即可实际执行相同的功能
grep -rl 'search phrase' ./

编辑:事实上,你不需要第一个for循环,不知道它是什么。

答案 3 :(得分:1)

这是一种方法,它保留了搜索内容的原始问题,但避免了循环:

#!/bin/bash

echo What phrase am I looking for:
read waldo

printf "\nSearching...\n\n"
# Use -l for grep to only show the file
# add searching /dev/null to avoid reporting errors from grep
find . -type f -mtime -7 -exec grep -l $waldo {} /dev/null ';'