「locate」コマンドの結果に基づいてどのように行動すればよいですか?

「locate」コマンドの結果に基づいてどのように行動すればよいですか?

'ファイルcheck_dns内のどこで定義されているかを見つけようとしていますが、ファイルは数多くあります。nagioscommands.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それぞれの結果を取得できるように、locate を実行してそれをインライン コマンドなどにパイプすることは可能ですかgrep? これは for ループで実行できることはわかっていますが、この特定のケースでそれを実行する方法よりも、ここでは bash-fu / shell-fu をいくつか習得したいと考えています。

答え1

はい、これに使用できますxargs

たとえば、単純なもの:

$ locate commands.cfg | xargs grep check_dns

(grep複数のファイルを検出すると、各ファイルを検索し、一致するファイル名の印刷を有効にします。)

または、次のようにしてファイル名の印刷を明示的に有効にすることもできます。

$ locate commands.cfg | xargs grep -H check_dns

(念のため、grep1つの引数のみで呼び出されますxargs

ファイル名引数を 1 つだけ受け入れるプログラムの場合 ( とは異なります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、ファイル名に空白が含まれている場合は当然問題になります...)

関連情報