Command-Line

從管道操作中獲取前 N 行輸出

  • November 21, 2017

我正在使用管道命令將大型生產數據庫從一台主機遷移到另一台主機:

mysqldump <someparams> | pv | mysql <someparams>

而且我需要從從一台伺服器傳遞到另一台伺服器的 SQL 中提取第 23 行(或者說是前 X 行)(保存為文件或簡單地保存在 bash 輸出中)。

我試過的:

  • 在輸出中連接less,至少可以看到輸出滾動,但沒有運氣

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

  • 閱讀有關sed,但這對我沒有用
  • 使用 head 寫入文件,但它是空的

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

我唯一的要求是我不能保存這個 .sql 文件。

任何的想法?

謝謝

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>

(雖然請注意 asbash不會等待該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

引用自:https://unix.stackexchange.com/questions/405956