如何通过使用grep获得没有path的文件名

我有以下问题。

我正在做一个grep

$ command = grep -r -i –include = *。cfg'host {'/omd/sites/mesh/etc/icinga/conf.d/objects

我得到了以下输出:

/omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test1.cfg:define host{ /omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test2.cfg:define host{ /omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test3.cfg:define host{ ... 

所有* .cfg文件。

exec($command,$array)

我传递了一个数组的结果。

是否有可能只得到grep命令的结果文件名。

我已经尝试了以下内容:

 $Command= grep -l -H -r -i --include=*.cfg 'host{' /omd/sites/mesh/etc/icinga/conf.d/objects 

但是我得到了同样的结果。

我知道在论坛上有一个类似的话题( 我怎样才能使用grep在linux上显示文件名(没有内联的匹配)? ),但是这个解决scheme并没有工作。

用“exec($ Command,$ result_array)”我尝试获得结果数组。 提到的解决scheme都可以,但是我不能用exec()来得到结果arrays。

谁能帮我?

Solutions Collecting From Web of "如何通过使用grep获得没有path的文件名"

又一个更简单的解决方案:

 grep -l whatever-you-want | xargs -L 1 basename 

basename是直接解决方案来获取没有路径的文件名

grep命令的结果是否可能只获取文件名?

grep你需要-l选项来显示文件名。

使用find ... -execdir grep ... \{} +你可能会阻止显示文件的完整路径(这是你需要的吗?)

 find /omd/sites/mesh/etc/icinga/conf.d/objects -name '*.cfg' \ -execdir grep -r -i -l 'host{' \{} + 

另外,关于你的问题的第二部分,为了将命令的结果读入数组 ,你必须使用下面的语法: IFS=$'\n' MYVAR=( $(cmd ...) )

在这种特殊情况下(为了清楚地显示表达的结构,我把它格式化为多行的语句 – 当然你可以写成“单行”):

 IFS=$'\n' MYVAR=( $( find objects -name '*.cfg' \ -execdir grep -r -i -l 'host{' \{} + ) ) 

然后像往常一样访问数组MYVAR的结果。 而我在测试的时候(在这个特殊情况下是3个):

 sh$ echo ${#MYVAR[@]} 3 sh$ echo ${MYVAR[0]} ./x y.cfg sh$ echo ${MYVAR[1]} ./d.cfg sh$ echo ${MYVAR[2]} ./e.cfg # ... 

这应该工作:

 grep -r -i --include=*.cfg 'host{' /omd/sites/mesh/etc/icinga/conf.d/objects | \ awk '{print $1}' | sed -e 's|[^/]*/||g' -e 's|:define$||' 

awk部分查找其中的第一个字段, sed命令修剪路径和:define