实时Linux grep脚本-仅显示正面结果

时间:2018-12-24 22:22:46

标签: linux bash shell grep

我尝试编写执行以下操作的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命令确实找到了某些内容时,模块的名称和列出的文件名?

2 个答案:

答案 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