コマンドの実行結果に基づいてテキストストリームをフィルタリングする標準ツールはありますか?
grep
たとえば、これを考えてみましょう。正規表現に基づいてテキストストリームをフィルタリングできます。しかし、より一般的な問題は、フィルタを拡張することです。たとえば、特定の基準に一致するすべてのファイルを選択したり(find
利用可能なスキャンが非常に多いがとにかくサブセット)、他のプログラムを使用してデータをフィルタリングしたりできます。次のパイプラインを考えてみましょう。
produce_data | xargs -l bash -c '[ -f $0 ] && ping -c1 -w1 $1 && echo $0 $@'
まったく役に立ちませんが、一般的なアプローチを提供します。 bash onelinerを使用して各行をテストできます。この例では、既存のファイルとアクセス可能なホストで構成される行が必要です。私はこれを行う標準的なツールが欲しいです。
produce_data | super_filter -- bash -c '[ -f $0 ] && ping -c1 -w1 $1'
以下で簡単に使用できますfind
。
find here | super_filter -- test -r
find
私がいつも忘れてしまった特定のフラグの代わりに一般的なツールを使ってファイルをフィルタリングする方法に注意してください。
より現実的な例は、特定のシンボルを含むオブジェクトファイルを見つけることです。これらのツールは役に立ちます。
したがって、super_filter
すべての条件チェッカーはストリーミングモードで実行できます。構文はinxargs
またはに似ていますparallel
。
答え1
追加すると、GNUパラレルは機能しませんか&& echo
?
... | parallel 'test -r {} && echo {}'
答え2
while read
方法(純粋なbash)
while read
入力を1行ずつ処理するための一般的な慣用語です(ファイルの行を繰り返す方法は?)。echo
元の入力ラインに対して検査および条件付き操作を実行します。
... | while IFS= read -r line; do test -r "$line" && echo "$line"; done
特別な場合:find
find
-exec
任意のタスクを実行し、見つかったファイルを確認することがあります。
からman find
:
-exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current file name be‐ ing processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoid‐ able security problems surrounding use of the -exec action; you should use the -execdir option instead.
例:
find here -exec test -r {} \; -print
-exec
ジョブはデフォルトの-print
ジョブをオーバーライドするため、-print
明示的に指定する必要があります。この動作は、find(1) のマニュアルページの EXPRESSION セクションで説明されています。追加の処理を適用するには、代わりに-print0
+を使用してください。xargs --null
-print