我试图编写一个bash 4(或者sh,如果可能的话)脚本,它执行以下操作:第一个参数:要搜索的压缩模块的路径,可以是“。
到目前为止,脚本看起来是这样的(请注意,它不是万无一失的,它没有检查这两个参数是否有效,它甚至没有检查是否给出了两个参数,如果我想让脚本按照我的意愿工作,我会添加所有这些)。
#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
echo $module
lsxzm $module | grep "$2"
donelsxzm是一个脚本,它列出了压缩的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这是如何做到的呢?我所能想到的只是暂时缓冲每个grep在for do do循环中的输出,并且只在grep发现什么时将它与模块的名称一起打印,通过检查$完成吗?grep的。
但这将是一个不那么优雅的解决方案。
现在我想知道,一个shell脚本(尤其是bash 4 )是否能够获得相同的结果,而不需要缓冲grep结果并检查grep命令的返回值以获得相同的结果:只在grep命令确实找到了什么时打印模块的名称和列出的文件名?
发布于 2018-12-25 06:50:05
您应该首先获得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 (ok),则grep成功(查找搜索字符串),因此输出数据。
发布于 2018-12-24 23:22:59
您只希望在grep返回某项内容时回显该模块。
for module in $(find $1 -type f -name "*.xzm"); do
lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
donehttps://stackoverflow.com/questions/53918069
复制相似问题