linux - Live Linux grep 脚本 - 只打印肯定的结果

标签 linux bash shell grep

我尝试编写一个执行以下操作的 bash 4(或 sh,如果可能)脚本: 第一个参数:要搜索的压缩模块的路径,可以是“.” 第二个要查找的搜索模式

脚本到目前为止看起来像这样(请注意它不是万无一失的,它不检查两个参数是否有效,它甚至不检查是否给出了 2 个参数,如果我得到脚本我会添加所有这些按照我的意愿工作)

#!/bin/bash
for module in $(find $1 -type f -name "*.xzm"); do
    echo $module
    lsxzm $module | grep "$2"
done

lsxzm 是一个列出压缩 live 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 命令确实找到某些东西时,模块的名称和列出的文件名?

最佳答案

你应该先得到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 的输出被存储到变量“result”中。 检查退出状态;如果它是 0 (ok),则 grep 成功(找到搜索字符串),因此数据被打印出来。

关于linux - Live Linux grep 脚本 - 只打印肯定的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53918069/

相关文章:

linux - 如何关闭除运行 shell 脚本的窗口之外的所有打开的终端窗口

linux - 使用 xargs 和两个参数并行下载

linux - 让 bash 脚本在 'interactive mode' 提示符下输入数字

java - 如何作为 Web 服务安全地执行 shell 命令

shell - 如何在 shell 脚本中解析配置文件 (*.conf)?

php - mysql无法创建外键错误121但不存在

c++ - 共享库 RPATH 和二进制 RPATH 优先级

linux - 在 linux 上完成密码字段 scp 命令

linux - 如何使用 mutt 在程序完成时向我发送通知

python - 如何在 linux 中列出守护进程(服务)进程,与 psutil 一样?