我尝试编写执行以下操作的bash 4(或sh,如果可能的话)脚本: 第一个参数:要搜索的压缩模块的路径可以是“。”。 第二个搜索模式寻找
到目前为止,脚本看起来像这样(请注意,它不是万无一失的,它不会检查两个参数是否都有效,甚至不会检查是否给出了两个参数,这是我得到脚本时要添加的全部内容按我的意愿工作)
#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
echo $module
lsxzm $module | grep "$2"
done
lsxzm是一个脚本,该脚本列出了压缩的实时Linux模块的内容。 现在,这样搜索的可能结果看起来像这样(让我考虑将脚本保存为“ / usr / local / bin / lsxzmgrep”并使其可执行):
/porteus/base# lsxzmgrep . libtiff.so.3
./000-kernel.xzm
./001-core.xzm
/usr/lib64/libtiff.so.3
/usr/lib64/libtiff.so.3.9.7
./001-de-core_locales.xzm
./002-xorg.xzm
./003-xfce.xzm
./010-nvidia-304.137-k.4.16.3-x86_64-don.xzm
我只希望得到以下输出:
/porteus/base# lsxzmgrep . libtiff.so.3
./001-core.xzm
/usr/lib64/libtiff.so.3
/usr/lib64/libtiff.so.3.9.7
这怎么办? 我所能想到的只是暂时地缓冲了for do done循环中每个grep的输出,并且仅当grep确实找到了东西时才将其与模块名称一起打印出来,方法是检查$? grep。
但这将不是一个优雅的解决方案。
现在,我想知道的是一个shell脚本,尤其是对于bash 4而言,能够获得相同的结果而无需缓冲grep结果并检查grep命令的返回值以获取相同的结果:仅打印名称grep命令确实找到了某些内容时,模块的名称和列出的文件名?
答案 0 :(得分:1)
您应该首先获取grep结果,然后打印出数据:
#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
result=$(lsxzm $module | grep "$2")
if [ $? -eq 0 ]; then
# grep returned OK, write out results
echo $module
echo "$result"
fi
done
为此,将grep的输出存储到变量“结果”中。 检查出口状态;如果它是0(确定),则grep成功(找到了搜索字符串),因此打印了数据。
答案 1 :(得分:0)
您只想在grep
返回内容时回显模块。
for module in $(find $1 -type f -name "*.xzm"); do
lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
done