👋

top コマンドをバッチモードで起動して各行に文字列を付与する

2023/08/26に公開

結論

top コマンドをバッチモードで起動して各行に文字列( /var/log/syslog: )を付与する

top -b -d 1 | sed  "s#^#\n/var/log/syslog: #g" |  grep -v ^$

コマンドラインを表示する場合(-c オプション指定)

top -c -b -d 1 | sed  "s#^#\n/var/log/syslog: #g" |  grep -v ^$

説明

top コマンドをバッチモードで起動するには top -b -d 1 のようにして起動する。
-b がバッチモードの指定で -d 1 の部分は取得間隔でこの場合 1秒毎に取得する。

top コマンドの結果をログに出力して解析しやすいように、各行の先頭に特定の文字列を
付与することを考える。

ただ top コマンドのバッチモードは一つ困りごとがある。それは一回の取得周期の最後の行のところで改行が付与されないので、他のログと混ざると行の途中から別のログが混ざってしまうことである。

このため top コマンドの出力に対して先頭に改行(およびログ解析に役立つ文字列)を付与したうえで、その結果に対して空行を削除する操作を行う。

先頭に改行(およびログ解析に役立つ文字列)を付与する

sed で行頭にマッチする正規表現 ^ に対して、改行を含む文字列に置換する操作を行う。
以下では /var/log/syslog のように / を含む文字列に置換するため区切り文字に / の代わりに # を使用している。

sed  "s#^#\n/var/log/syslog: #g"

空行を削除する。

行頭の後に行末の場合、つまり空行の場合にマッチしなかったものを取り出すことにより、空行を削除する。

grep -v ^$

参考サイト

https://linux.just4fun.biz/?逆引きUNIXコマンド/sedを使って行の先頭に文字列を追加する

https://ex1.m-yabe.com/archives/3692

https://linuxjm.osdn.jp/html/procps/man1/top.1.html

Discussion