关于linux:如何使用grep只获取没有Path的文件名

How to get only filenames without Path by using grep

我有以下问题。

我在做一件伟大的事:

$command=grep-r-i--include=*.cfg'主机'/omd/sites/mesh/etc/icinga/conf.d/objects

我得到了以下输出:

1
2
3
4
/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命令的结果,是否可以只获取文件名?

我尝试了以下方法:

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

但我得到了同样的结果。

我知道在论坛上也有类似的主题。(如何使用grep在Linux上只显示文件名(没有内嵌匹配项?)但解决方案不起作用。

使用"exec($command,$result_array)",我尝试获取包含结果的数组。上面提到的解决方案都有效,但是我不能用exec()获取resultArray。

有人能帮我吗?


另一个简单的解决方案是:

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

或者,如果您不使用GNU coreutils的古老版本,您可以避免使用xargs并使用子外壳:

1
basename -a $(grep -l whatever-you-want)

basename是一个简单的bash解决方案,它可以获取不带路径的文件名。您也可能对dirname感兴趣,只想获得路径。

GNU coreutils basename文档


Is it possible to get only the filenames as result of the grep command.

使用grep时,您需要-l选项仅显示文件名。

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

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

另外,关于问题的第二部分,要将命令的结果读取到数组中,必须使用语法:IFS=$'
' MYVAR=( $(cmd ...) )

在这种特定的情况下(我格式化为多行语句,以便清楚地显示表达式的结构——当然,您可以用"一行程序"编写):

1
2
3
4
5
6
7
IFS=$'
'
MYVAR=(
    $(
        find objects -name '*.cfg' \
                     -execdir grep -r -i -l 'host{' \{} +
    )
)

然后,您可以像往常一样访问数组MYVAR中的结果。当我在测试的时候(在那个特定的案例中有3个匹配项):

1
2
3
4
5
6
7
8
9
sh$ echo ${#MYVAR[@]}
3
sh$ echo ${MYVAR[0]}
./x y.cfg
sh$ echo ${MYVAR[1]}
./d.cfg
sh$ echo ${MYVAR[2]}
./e.cfg
# ...


这应该有效:

1
2
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