首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只打印正结果的Linux grep脚本

只打印正结果的Linux grep脚本
EN

Stack Overflow用户
提问于 2018-12-24 22:22:46
回答 2查看 409关注 0票数 0

我试图编写一个bash 4(或者sh,如果可能的话)脚本,它执行以下操作:第一个参数:要搜索的压缩模块的路径,可以是“。

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

代码语言:javascript
复制
#!/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“并使其可执行):

代码语言:javascript
复制
/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

我只想得到以下结果:

代码语言:javascript
复制
/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命令确实找到了什么时打印模块的名称和列出的文件名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-25 06:50:05

您应该首先获得grep结果,然后打印出数据:

代码语言:javascript
复制
#!/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成功(查找搜索字符串),因此输出数据。

票数 1
EN

Stack Overflow用户

发布于 2018-12-24 23:22:59

您只希望在grep返回某项内容时回显该模块。

代码语言:javascript
复制
for module in $(find $1 -type f -name "*.xzm"); do
    lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53918069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档