Получить первые N строк вывода из операции конвейера

Получить первые N строк вывода из операции конвейера

Я использую команду piped для переноса большой производственной базы данных с одного хоста на другой с помощью этой команды:

mysqldump <someparams> | pv | mysql <someparams>

И мне нужно извлечь строку 23 (или, скажем, первые X строк) (сохранить в файле или просто в выводе bash) из SQL, передаваемого с одного сервера на другой.

Что я пробовал:

  • Объединить в выводе less, по крайней мере, чтобы увидеть прокрутку вывода, но безуспешно

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

  • Читал о sed, но мне это не пригодилось

  • Использую head для записи в файл, но он пуст

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>

(хотя следует помнить, что as 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

Связанный контент