Obtenha as primeiras N linhas de saída de uma operação de pipe

Obtenha as primeiras N linhas de saída de uma operação de pipe

Estou usando um comando canalizado para migrar um grande banco de dados de produção de um host para outro usando este comando:

mysqldump <someparams> | pv | mysql <someparams>

E preciso extrair a linha 23 (ou digamos as primeiras X linhas) (salva como arquivo ou simplesmente na saída do bash) do SQL passando de um servidor para outro.

O que eu tentei:

  • Concatene em output less, pelo menos para ver a rolagem da saída, mas sem sorte

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

  • Leia sobre sed, mas não é útil para mim

  • Usando head para gravar em um arquivo, mas está vazio

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

O único requisito que tenho é que não consigo salvar este arquivo .sql.

Qualquer ideia?

Obrigado

Responder1

Comzsh

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

Com bash(ou zsh):

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

(embora tenha cuidado, pois bashnão espera por esse sedprocesso, não é garantido que ele saved-lines-22-to-24.txtestará concluído no momento em que você executar o próximo comando no script).

Ou você pode ter sedque escrever:

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

Para tê-lo como saída, com zsh:

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

ou bash/ zsh:

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

informação relacionada