UNIX系OSで、ものすごく限定された目的にしか使えない小ネタ

2018年2月18日

この記事は最初の投稿日から18年経過しています。内容が古い可能性があります。

標準入力に日時を付加して標準出力に出力する。(awk版)

定期的な間隔で情報出力するコマンド、かつ、日時を出力しないコマンドにおいて、時間を付加してログをとりたい時に使います。

strftime が使える awk のみ。GNU awk 等。

awk '{print strftime("%H:%M:%S")" "$0}'
使用例)
% vmstat 2 | awk '{print strftime("%H:%M:%S")" "$0}'
21:03:29 procs                      memory      swap          io     system         cpu
21:03:29  r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
21:03:29  1  0      0 164988  36100  51204    0    0     1    10  117   108  1  4 94  2
21:03:31  0  0      0 164988  36100  51204    0    0     0     0  137   130  0  1 99  0
21:03:33  0  0      0 164988  36100  51204    0    0     0    24  103   105  0  0 98  2

標準入力に日時を付加して標準出力に出力する。(perl版)

GNU awk とかが使えないときに。

perl -ne '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);print "$hour:$min:$sec $_";'

perl は、今ひとつわかってないので、もっといい方法があると思うのですが…。

使用例)
% vmstat 2 | perl -ne '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);print "$hour:$min:$sec $_";'
21:6:2 procs                      memory      swap          io     system         cpu
21:6:2  r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
21:6:2  0  1      0 164020  36116  51204    0    0     1    10  117   108  1  4 94  2
21:6:4  0  0      0 164020  36140  52252    0    0   534    76  128   135  0  2 78 20
21:6:6  0  0      0 164020  36140  52252    0    0     0     0  102    88  0  0 100  0

定常的に動かすのであれば、logger にそのまま流し込んでもよさそうな気もします。

ファイルの修正年月でディレクトリを作成し、そこにファイルを移動するシェルスクリプト

たとえば、単一ディレクトリに大量のログファイルがあり、そのファイルを「年月」というディレクトリに振り分けたい時とかに使います。

#!/bin/sh
find -name \*.log | while read file;
do
dirpath=`stat $file | grep Modify | awk '{print $2}' | sed 's/-..$//'`;
mkdir $dirpath > /dev/null 2>&1
mv $file $dirpath
done

cacti で、ntpd の状態を取得するためのシェルスクリプト

ものすごーく限定された状況用のシェルスクリプトです。cacti の話を書きたいのですが、色々整理しないと書けないので保留気味。

このシェルスクリプトを使って ntpd の状態を cacti に取り込み、グラフ化してます。

下記は、ntp1.jst.mfeed.ad.jp、ntp2.jst.mfeed.ad.jp、ntp3.jst.mfeed.ad.jp と同期を取っている場合。

#!/bin/sh
/usr/sbin/ntpq -p localhost | awk '{
if (NR != 1 || NR != 2) {
if ($1 ~ ".ntp1\.jst\.mfeed") {
delay1 = $8
offset1 = $9
jitter1 = $10
} else if ($1 ~ ".ntp2\.jst\.mfeed") {
delay2 = $8
offset2 = $9
jitter2 = $10
} else if ($1 ~ ".ntp3\.jst\.mfeed") {
delay3 = $8
offset3 = $9
jitter3 = $10
}
}
} END {
printf("delay1:%s delay2:%s delay3:%s offset1:%s offset2:%s offset3:%s jitter1:%s jitter2:%s jitter3:%s", delay1, delay2, delay3, offset1, offset2, offset3, jitter1, jitter2, jitter3)
}'
使用例)
% ntpq -p localhost
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. fs-monntp1.mfee  2 u  947 1024  377   30.160   -6.799   2.879
*ntp2.jst.mfeed. fs-monntp2.mfee  2 u  437 1024  377   20.076   -3.638   2.882
+ntp3.jst.mfeed. fs-monntp2.mfee  2 u  444 1024  377   20.110   -2.601   3.970
% ./ntpstat.sh
delay1:30.160 delay2:20.076 delay3:20.110 offset1:-6.799 offset2:-3.638 offset3:-2.601 jitter1:2.879 jitter2:2.882 jitter3:3.970

未分類

Posted by toshyon