如何从grep结果中提取文件名?

时间:2018-12-20 21:40:27

标签: regex bash awk sed grep

我正在尝试获取系统启动时执行的所有程序的列表。

我的游戏计划如下:

  • grep -r目录/etc/init.d/etc/rc.d/*
  • 搜索任何以“ /”开头的行
  • 包括反引号和$()的执行
  • 通过指定完整路径来执行假设执行,而忽略相对路径执行(即./...

为此,我使用了以下内容:

egrep -r '^\s*/|\$\(\s*/|\`\s*/' /etc/rc.d/* /etc/init.d

由于它正在搜索目录中的文件,因此结果将列出在其中找到的文件以及整行。我现在想将结果通过管道传输到某种文件中,以获取文件名,通过管道将其传输到sort|uniq中,以获取简化列表。我想我可以以某种方式使用awk,但是我对此并不熟悉。

示例结果:

/etc/init.d/foo:             foo=$(/bin/echo hello)
/etc/init.d/bar:             bar=$(/bin/echo world)
/etc/rc.d/init.d/foobar:     /bin/false

所需的输出:

/bin/echo
/bin/false

2 个答案:

答案 0 :(得分:2)

如果将-h选项添加到egrep,则不会显示文件名。

egrep -hr '^\s*/|\$\(\s*/|\`\s*/' /etc/rc.d/* /etc/init.d | sed -e 's/\($(\|)\)//g'

该sed正则表达式将删除所有“ $(”和“)”

答案 1 :(得分:0)

好的,感谢alb3rtobr的帮助,我能够得到它:

egrep -hor '(^\s*/|\$\(\s*/|\`\s*/)[^ ]*' /etc/rc.d/* /etc/init.d | sed -e 's/\($(\|)\|^\s*\)//g' | sort | uniq  

我修改了egrep以继续匹配,直到遇到空格为止,然后添加了-o选项以仅返回匹配的模式。我还修改了sed以修剪前导空白。

编辑:已更改为匹配模式,而不是空格字符