web-dev-qa-db-ja.com

パイプ操作から最初のN行の出力を取得します

パイプコマンドを使用して、次のコマンドを使用して、大きな本番DBをあるホストから別のホストに移行しています。

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ファイルを保存できないことです。

何か案が?

ありがとう

2
Ghesio

zshを使用

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

bash(または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
2