Live Linux grep脚本-仅打印积极结果

Live Linux grep脚本-仅打印积极结果,linux,bash,shell,grep,Linux,Bash,Shell,Grep,我尝试编写一个bash 4(或sh,如果可能的话)脚本,该脚本执行以下操作: 第一个参数:要搜索的压缩模块的路径,可以是“” 第二,要查找的搜索模式 到目前为止,脚本看起来是这样的(请注意,它不是万无一失的,它不会检查两个参数是否都有效,它甚至不会检查是否给出了两个参数,如果我让脚本按我希望的方式工作,我将添加的所有内容) lsxzm是一个脚本,它列出了压缩的livelinux模块的内容。 现在,这样的搜索的一个可能的结果看起来是这样(让我把脚本保存为“/Ur/Studio/BI/LSXZMGR

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

到目前为止,脚本看起来是这样的(请注意,它不是万无一失的,它不会检查两个参数是否都有效,它甚至不会检查是否给出了两个参数,如果我让脚本按我希望的方式工作,我将添加的所有内容)

lsxzm是一个脚本,它列出了压缩的livelinux模块的内容。 现在,这样的搜索的一个可能的结果看起来是这样(让我把脚本保存为“/Ur/Studio/BI/LSXZMGRIP”并使其可执行):

我只希望有以下输出:

/porteus/base# lsxzmgrep . libtiff.so.3
./001-core.xzm
/usr/lib64/libtiff.so.3
/usr/lib64/libtiff.so.3.9.7
如何做到这一点? 我所能想到的就是暂时缓冲fordo-done循环中每个grep的输出,并且当grep通过检查$找到某个东西时,仅将其与模块名称一起打印?格雷普的

但这不是一个优雅的解决方案


现在我想知道,一个shell脚本,特别是对于bash4,是否能够在不需要缓冲grep结果和检查grep命令的返回值的情况下获得相同的结果:只打印模块名和列出的文件名当grep命令确实找到了什么东西时?

您只想在
grep
返回什么东西时回显模块

for module in $(find $1 -type f -name "*.xzm"); do
    lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
done

您应该首先获得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(确定),则grep成功(找到搜索字符串),因此数据被打印出来。

似乎出了问题,使用您的代码,与我最初的帖子中相同的查询给出了以下错误:$lsxzmgrep。libtiff.so.3 sed:-e expression#1,char 10:number选项到
s'命令可能不是零sed:-e expression#1,char 11:unknown选项到
s'上一个错误重复了好几次。我尝试用“行尾2个空格”添加br,但由于某些原因我无法保存编辑。抱歉,我测试了模块的随机值。在您的情况下,模块将有斜杠,这将混淆
sed
命令/I更新我的答案并使用
#
。谢谢Linuxfan,这就解决了问题。如果不需要将grep结果存储在变量中并检查grep状态,似乎没有什么好办法。@Rava您可以通过调用grep两次来避免存储结果。第一次使用grep选项
-l
,它会打印出文件名而不是匹配的文件名。不知道是否更好。否则,正如Walter所建议的那样,过滤整个结果的想法并不坏,但我对sed/awk还不够了解。
for module in $(find $1 -type f -name "*.xzm"); do
    lsxzm ${module} | grep "$2" | sed -r "s#.+#${module}\n&#"
done
#!/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