パイプライン操作で最初のN行の出力を取得する

パイプライン操作で最初のN行の出力を取得する

次のコマンドを使用して、パイプラインコマンドを使用してあるホストから別のホストに大規模な本番データベースを移行しています。

mysqldump <someparams> | pv | mysql <someparams>

あるサーバーから別のサーバーに渡されたSQLから23行(または最初のX行)を抽出する必要があります(ファイルに保存するか、単にbash出力に保存)。

私が試したこと:

  • 出力を接続すると、少なくともless出力スクロールを見ることができますが、運はありません。

    mysqldump <someparams> | pv | mysql <someparams> | less

  • それについて読んでみましたが、sed私には効果がありませんでした。

  • ファイルへの書き込みにヘッドを使用しましたが、ファイルは空です。

mysqldump <someparams> | pv | mysql <someparams> | head -n 25 > somefile.txt

唯一の要件は、この.sqlファイルを保存できないことです。

どんなアイデアがありますか?

ありがとう

答え1

そしてzsh

mysqldump <someparams> |
  pv > >(sed '22,24!d' > saved-lines-22-to-24.txt) |
  mysql <someparams>

そしてbash(OR zsh):

mysqldump <someparams> |
  pv |
  tee >(sed '22,24!d' > saved-lines-22-to-24.txt) |
  mysql <someparams>

(プロセスbashを待たないため、スクリプトで次のコマンドを実行するまでプロセスが完了するというsed保証はありません。)saved-lines-22-to-24.txt

sedまたは、次のように書く必要があります。

mysqldump <someparams> |
  pv |
  sed '22,24 w saved-lines-22-to-24.txt' |
  mysql <someparams>

これを出力として取得するには、次のようにしますzsh

{mysqldump <someparams> |
  pv > >(sed '22,24!d' >&3) |
  mysql <someparams>} 3>&1

またはbash/ zsh:

{ mysqldump <someparams> |
  pv |
  tee >(sed '22,24!d' >&3)
  mysql <someparams>
} 3>&1

関連情報