4

パイプ出力の特定の行をその番号で返す bash 関数を作成しようとしています。現在、完全なコマンドは次のようになっています。

mdfind 'my_search_string' | sed "2q;d"

これにより、mdfind コマンドからの出力の 2 行目が返されます。

sed "$1q;d"エイリアスとして割り当てられる関数に変えようとしています。

パイプ入力を処理するにはどうすればよいですか?

4

4 に答える 4

0

私の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)

于 2013-09-03T14:16:46.597 に答える
0

演習として -- このバージョンは純粋な 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 バージョンは、入力ストリームが短い場合 (または長いストリームから初期の行を選択する場合) は高速ですが、長いストリームでは遅くなります。

于 2013-09-03T14:21:49.653 に答える