Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何从grep结果中提取文件名?_Regex_Bash_Awk_Sed_Grep - Fatal编程技术网

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

Regex 如何从grep结果中提取文件名?,regex,bash,awk,sed,grep,Regex,Bash,Awk,Sed,Grep,我正在尝试获取系统启动时执行的所有程序的列表 我的游戏计划如下: grep-retc/init.d和/etc/rc.d/*目录 搜索任何明确以“/”开头的行 包括从backticks和$()执行 假设通过指定完整路径执行,忽略相对路径执行(即/…) 为此,我使用了以下方法: egrep -r '^\s*/|\$\(\s*/|\`\s*/' /etc/rc.d/* /etc/init.d 因为它在目录中搜索文件,所以结果会列出找到它的文件和完整行。现在,我想通过管道将结果导入到某个文件中,以

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

我的游戏计划如下:

  • grep-r
    etc/init.d和
    /etc/rc.d/*
    目录
  • 搜索任何明确以“/”开头的行
  • 包括从backticks和$()执行
  • 假设通过指定完整路径执行,忽略相对路径执行(即
    /…
为此,我使用了以下方法:

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

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

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

sed regex将删除所有“$”(“and”)”

好的,多亏了alb3rtobr的帮助,我才能够得到它:

egrep -hor '(^\s*/|\$\(\s*/|\`\s*/)[^ ]*' /etc/rc.d/* /etc/init.d | sed -e 's/\($(\|)\|^\s*\)//g' | sort | uniq  
我修改了egrep以继续匹配,直到遇到空格,然后添加了
-o
选项以仅返回匹配的模式。我还修改了sed以修剪前导空格

编辑:更改为匹配图案,而不是空格字符