循环grep函数

时间:2018-12-14 17:42:08

标签: bash

因此,我正在为同事构建脚本,以便她可以轻松扫描文件中是否出现字符串。但是我的grep命令遇到了麻烦。

    #!/bin/bash -x

filepath() {
echo -n "Please enter the path of the folder you would like to scan, then press [ENTER]: "
read path
filepath=$path
}

filename () {
echo -n "Please enter the path/filename you would like the output saved to, then press [ENTER]: "
read outputfile
fileoutput=$outputfile
touch $outputfile
}
searchstring () {
echo -n "Please enter the string you would like to seach for, then press [ENTER]: "
read searchstring
string=$searchstring
}
codeblock() {
for i in $(ls "${filepath}")
do
  grep "'${string}'" "$i" | wc -l | sed "s/$/ occurance(s) in "${i}" /g" >> "${fileoutput}"
done
}

filepath
filename
searchstring
codeblock
exit

我知道有很多额外的变量“重定向”,只是练习我的脚本。这是我运行命令时收到的错误。

+ for i in '$(ls "${filepath}")'
+ grep ''\''<OutageType>'\''' *filename*.DONE.xml
+ wc -l
+ sed 's/$/ occurance(s) in *filename*.DONE.xml /g'
grep: *filename*.DONE.xml: No such file or directory 

但是,如果我从命令行运行带有wc和sed功能的grep命令,则可以正常工作。

# grep '<OutageNumber>' "*filename*.DONE.xml" | wc -l | sed "s/$/ occurance(s) in "*filename*.DONE.xml" /g"
13766 occurance(s) in *filename*.DONE.xml

1 个答案:

答案 0 :(得分:2)

这里有几处错误。

for i in $(ls "${filepath}")

文件路径的值为*filename*.DONE.xml,并且如果您假设*在此处扩展,则不会发生。 shell会直接在双引号字符串变量中使用*不会被扩展。

如果您想扩展通配符以匹配文件名模式, 那么您就无法在命令中双引号了。

接下来,强烈建议不要解析ls命令的输出。这样会更好:

for i in ${filepath}

这仍然不会是“完美的”,因为如果没有文件匹配该模式, 那么grep将失败。为避免这种情况,您可以启用nullglob选项:

shopt -s nullglob
for i in ${filepath}

最后,我建议消除此for循环, 并直接使用grep命令:

grep "'${string}'" ${filepath} | ...