在 Linux 中 grep 变量时遇到问题

在 Linux 中 grep 变量时遇到问题

下面是我正在尝试的代码:

{    
echo "Enter dirname and hit Return"
read input1
echo "Enter a pattern to be searched for in the current directory"
read input2
find /*/${input1}/*/logs/*/*/*/* -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "${input2}"' {} \;
}

虽然 input1 匹配,但 input2 似乎不匹配,并且我获得了 input1 的所有输出,但没有让 input2 与之匹配。

目的是读取所有.gz文件并获取关键字input2匹配。

答案1

调用的“内部”脚本find无权访问该$input2变量。

你可以这样做

find /*/"$input1"/*/logs/*/*/*/* -name '*.gz' \
    -exec sh -c 'gzip -cd "$1" | grep -e "$0"' "$input2" {} \;

这会将 的值传递$input2到内部脚本中,并使其可用,$0而文件名参数将为$1

或者,只需解find压缩文件并过滤find整个输出:

find /*/"$input1"/*/logs/*/*/*/* -name '*.gz' \
    -exec gzip -cd {} + | grep -e "$input2"

由于find已经进入给定顶级目录的所有子目录,您可能可以省略一些文件名 glob 并改为使用-mindepth 4(如果您find支持此选项),并添加-type f以表明您只对常规文件感兴趣:

find /*/"$input1"/*/logs -mindepth 4 -type f -name '*.gz' \
    -exec gzip -cd {} + | grep -e "$input2"

相关内容