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

1

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 eu preciso extrair a linha 23 (ou digamos as primeiras linhas X) (salvas como arquivo ou simplesmente na saída bash) do SQL passando de um servidor para outro.

O que eu tentei:

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

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

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

  • Usando a cabeça 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 posso salvar este arquivo .sql.

Alguma ideia?

Obrigado

    
por Ghesio 21.11.2017 / 11:16

1 resposta

1

com zsh

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 esteja ciente de que, como bash não espera pelo processo sed , não é garantido que saved-lines-22-to-24.txt esteja completo no momento em que você executar o próximo comando no script).

Ou você pode ter sed na redação:

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
    
por 21.11.2017 / 11:46