【问题标题】:How can I extract a file name from a grep result?如何从 grep 结果中提取文件名?
【发布时间】:2018-12-26 22:19:32
【问题描述】:

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

我的游戏计划如下:

  • 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

【问题讨论】:

    标签: regex bash awk sed grep


    【解决方案1】:

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

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

    那个 sed 正则表达式会删除所有的 "$(" 和 ")"

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 2017-01-05
        • 2015-08-25
        相关资源
        最近更新 更多