awkコマンドで、topコマンドの結果を整形して保存したいです。 top -bn1 | awk '<式>' とやればできますが、topコマンドで継続的に実行して
awkコマンドで、topコマンドの結果を整形して保存したいです。 top -bn1 | awk '<式>' とやればできますが、topコマンドで継続的に実行して top -b -d 1 | awk '<式>' とすると、awkの結果が出力されません。 awkは、左側のコマンドが終了されないと実行されない(処理されない)のでしょうか。 この動きは、オプションなどで変更できないのでしょうか。 # 動きだけでいけば、top -bn 1 をbashで回せば解決しますが、質問の主旨は、awk側の挙動のほうになります。
すいません、間にgrepを入れてました。top | awk だと、確かに普通に出力されました。 top -b -d 1 | grep -e Cpu -e Mem | awk '{if(NR%3)ORS=",";else ORS="\n"; print}' こんな感じです。 あと、実行環境は、WSLのUbuntu18.04です。 unbufferというのも試してみましたが、うまくいってません。(あまり深く見れてないですが。。)
ベストアンサー
awkの仕様でもなくパイプのバッファ量の問題ですかね。 以下参照していろいろやってみるとよいかと。。。 https://genzouw.com/entry/2019/06/12/170055/1602/ https://www.webdevqa.jp.net/ja/shell/%E3%83%91%E3%82%A4%E3%83%97%E3%81%AE%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB%E3%81%99%E3%82%8B/956753712/
1人がナイス!しています
top -b -d 1 | grep -e Cpu -e Mem | awk '{if(NR%3)ORS=",";else ORS="\n"; print}' ↑これでも、しばらく待ってバッファがいっぱいなると、出力される。 stddefを使ってみたがうまくいかない。 https://linuxcommand.net/stdbuf/ めんどくさいので書き換えた。 top -b -d 1 | awk 'BEGIN{i=0}/Cpu|Mem/{i++;if(i%3)ORS=",";else ORS="\n";print}'
質問者からのお礼コメント
ありがとうございました!
お礼日時:2021/12/21 21:24