パイプ出力の特定の行をその番号で返す bash 関数を作成しようとしています。現在、完全なコマンドは次のようになっています。
mdfind 'my_search_string' | sed "2q;d"
これにより、mdfind コマンドからの出力の 2 行目が返されます。
sed "$1q;d"
エイリアスとして割り当てられる関数に変えようとしています。
パイプ入力を処理するにはどうすればよいですか?
私のawked bashエイリアス:
alias second="awk 'FNR==2'"
cat file | second
また
second file
よくわかりませんが、フィルタする行数をパラメータとして取得する関数を書きますか? また、パイプされた入力を処理して、その行を除外したいですか? パイプされた入力は関数の引数になり、 ですべてを取得できます$@
。
申し訳ありませんが、OPが望んでいたことを理解しています:)
私が得たように、彼はstd
パラメーターを使用してシェル関数によって入力を処理したいと考えています。
cmd | func args
したがって、次のように動作します。
function sift { awk "FNR==$1" ;}
例:
cat file | sift 2
awk
( vsに関するコメントを参照sed
)
演習として -- このバージョンは純粋な bash であり、外部ツールをまったく使用していません。
return_line() {
local lineno=$1
while (( lineno > 1 )); do read; (( lineno-- )); done
read -r && printf '%s\n' "$REPLY"
}
# ...to test...
return_line 3 <<<$'one\ntwo\nthree\nfour'
# ...and yes, this works with pipelines...
printf 'one\ntwo\nthree\nfour' | return_line 3
通常、pure-bash バージョンは、入力ストリームが短い場合 (または長いストリームから初期の行を選択する場合) は高速ですが、長いストリームでは遅くなります。