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文件。
与
我以数组的形式传递了结果。
作为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的古老版本,您可以避免使用
1 | basename -a $(grep -l whatever-you-want) |
GNU coreutils basename文档
Is it possible to get only the filenames as result of the
grep command.
使用
使用
1 2 | find /omd/sites/mesh/etc/icinga/conf.d/objects -name '*.cfg' \ -execdir grep -r -i -l 'host{' \{} + |
另外,关于问题的第二部分,要将命令的结果读取到数组中,必须使用语法:
' MYVAR=( $(cmd ...) )
在这种特定的情况下(我格式化为多行语句,以便清楚地显示表达式的结构——当然,您可以用"一行程序"编写):
1 2 3 4 5 6 7 | IFS=$' ' MYVAR=( $( find objects -name '*.cfg' \ -execdir grep -r -i -l 'host{' \{} + ) ) |
然后,您可以像往常一样访问数组
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$||' |