「検索」コマンドの結果に基づいてアクションをとるには?

「検索」コマンドの結果に基づいてアクションをとるには?

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各結果を得るために検索を実行し、同様のインラインコマンドまたは他のものにパイプすることはできますかgrep? forループを使用してこれを行うことができることを知っていますが、ここではbash-fu / shell-fuを理解したいと思います。この特定のケースに対して行う方法ではありません。

答え1

はい、これを使用できます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。もちろん、ファイル名にスペースが含まれていると問題になります...)

関連情報