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

パイプ操作から出力の最初の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 ファイルを保存できないことです。

何か案が?

ありがとう

答え1

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

関連情報