†でおきしブログ†

ウナギ食べたいヽ(•̀ω•́ )ゝ✧

【bash】topコマンドをパイプでgrepかけた後にリダイレクションでファイル出力する時は--line-bufferedオプションを使う

f:id:deokisikun:20181209221612p:plain
「topコマンドで特定のプロセスをファイル出力したい」と思いgrepで絞り込んでみようと試みたのですが、上手くいかなかったので、その時調べた事をまとめておきますよ。

☆普通にtopをリダイレクションした場合

top > test.txt

topだけならファイル出力できる

☆しかしgrepをパイプで連結すると

top | grep bash > test.txt

これやると出力内容が空っぽになる。
※とりあえずgrep検索条件は"bash"としています



しかしlsコマンドの場合はgrepかけても出力できるんだよね。

ls |  grep test > test.txt

※test.txtが存在するディレクトリで実行

topコマンドみたく表示更新される系の奴は駄目なのかしらね。
よく分からん!分かる人教えてプリーズ。

☆--line-bufferedオプション使えば回避できるぜ!

top | grep --line-buffered bash > test.txt

grepの結果をリダイレクションやパイプに渡す時に期待通りにならない場合には--line-bufferedオプションをつけると回避できるらしいのだ。
オプション付けずに動いてくれたらいいのに何やねんと思う。何か理由があるのだろうか。

ちなみにgrepコマンド以外でも同じような事になる場合があるらしいので、バッファ絡みのオプションを意識すると良さそう。

★ディスプレイ表示しながらファイル出力する場合はteeコマンドが便利
top | grep --line-buffered bash | tee test.txt

teeコマンド使うと、画面表示しながらファイル出力されます。grepで絞り込んだプロセス情報をリアルタイムでウォッチしつつファイルにも保存したい時に便利!

★ついでに出力行数カウント(wcコマンド)も便利!

プロセス情報を確認しつつファイル出力行数もチェックしたければ、別ターミナル開いて"wc -l ファイル名"を実行しよう。
※wcってword countの略かしら?

wc -l test.txt

こうするとファイル内の行数がチェックできます。

チェックできますが、何度もコマンドを叩かないと変化がわかりませんよね?

であればこうするのじゃ!

while sleep 1;do wc -l test.txt;done;

1秒周期で無限ループだ!
「do〜;」を他のコマンドにすると応用できそう