Bash
如何對“定位”命令的結果採取行動?
我試圖找到在’文件
check_dns
中定義的位置,儘管有很多文件。nagios``commands.cfg
我知道我可以執行類似
find / -name "command.cfg" -exec grep check_dns {} \;
搜尋匹配項的操作,但如果可能的話,我想使用locate
它,因為它是一個索引副本,而且速度更快。當我執行時,
locate commands.cfg
我得到以下結果:/etc/nagios3/commands.cfg /etc/nagiosgrapher/nagios3/commands.cfg /usr/share/doc/nagios3-common/examples/commands.cfg /usr/share/doc/nagios3-common/examples/template-object/commands.cfg /usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg /var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg
是否可以執行定位並將其傳遞給內聯命令之類的
xargs
東西,以便我可以grep
得到每個結果?我意識到這可以通過 for 循環來完成,但我希望在這裡找到一些 bash-fu / shell-fu,而不是如何針對這種特定情況進行操作。
是的,您可以使用
xargs
它。例如一個簡單的:
$ locate commands.cfg | xargs grep check_dns
(當
grep
看到多個文件時,它會在每個文件中搜尋並啟用匹配的文件名列印。)或者您可以通過以下方式顯式啟用文件名列印:
$ locate commands.cfg | xargs grep -H check_dns
(以防萬一
grep
僅使用 1 個參數呼叫xargs
)對於只接受一個文件名參數的程序(與 不同
grep
),您可以限制提供的參數的數量,如下所示:$ locate commands.cfg | xargs -n1 grep check_dns
這不會列印匹配行來自的文件的名稱。
結果等價於:
$ locate commands.cfg | xargs grep -h check_dns
使用現代的 locate/xargs 您還可以防止出現空白問題:
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(預設情況下,空格分隔輸入
xargs
- 當您的文件名包含空格時,這當然是一個問題……)