Gawk

為什麼這個 gawk 協程序會掛起?

  • June 19, 2019

bash shell 中嘗試轉換日期時,我嘗試了GNU awk 的協同處理功能

gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; cmd |& getline d; $5 = d}1' foo

此命令掛起。我認為這可能是因為date正在等待讀取整個輸入,所以我嘗試關閉發送管道的一半:

gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; close(cmd, "to"); cmd |& getline d; $5 = d}1' foo

這有效(是的,我知道我應該設置OFS=,,但現在……)。

但是,date處理輸入時似乎沒有問題。這立即給出了第一行輸出:

d='Thu Apr 27 2017 23:19:47 GMT+0700 (ICT)'
(echo "$d"; sleep 1m; echo "$d") |
 date +"%Y-%m-%d %H:%M:%S" -f-

這是怎麼回事?

像許多其他程序一樣,date當 stdout 不是 tty 時,會緩衝 的輸出。通過呼叫它,stdbuf -oL您將在每一行刷新輸出,並且您的第一個 Gawk 範常式式碼將正常工作(無需關閉管道的寫入端)。

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