Obtenga las primeras N líneas de salida de una operación de tubería

Obtenga las primeras N líneas de salida de una operación de tubería

Estoy usando un comando canalizado para migrar una base de datos de producción grande de un host a otro usando este comando:

mysqldump <someparams> | pv | mysql <someparams>

Y necesito extraer la línea 23 (o digamos las primeras X líneas) (guardada como archivo o simplemente en la salida de bash) del SQL que pasa de un servidor a otro.

Lo que he probado:

  • Concatenar en la salida less, al menos para ver la salida desplazándose, pero no hubo suerte

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

  • Lea sobre sed, pero no me es útil.

  • Usando head para escribir en un archivo, pero está vacío

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

El único requisito que tengo es que no puedo guardar este archivo .sql.

¿Alguna idea?

Gracias

Respuesta1

Conzsh

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

Con basho zsh):

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

(aunque tenga en cuenta que, como bashno espera ese sedproceso, no se garantiza que saved-lines-22-to-24.txtesté completo cuando ejecute el siguiente comando en el script).

O podrías tener sedque escribir:

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

Para tenerlo como salida, con zsh:

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

o bash/ zsh:

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

información relacionada