ファイルシステム監視シェル

ファイルシステムの監視シェルです。監視対象のマウントポイントをリストファイルに記載しておく仕様です。監視インターバルは変更できるようになっています。

【シェルスクリプト】
filesystem_mon.sh

 
【リストファイル】
filesystem_mon.lst

 
【解説】
難しいのは以下の部分くらい。

この部分の処理の内容は、dfコマンドの結果からファイルシステムの使用率のパーセントの数字部分だけを抜き出している。sedコマンドの部分は、「^.* \([0-9]*\)%.*$」を「\1」に置換という意味。

sedコマンドの正規表現

記号 説明
^ 行の先頭
. 任意の1文字
* 直前の1文字または1パターンの0回以上の繰り返し
\( \) パターンのグループ化
\1 後方置換(1番目にグループ化した値を指す)
$ 行の末尾

上記を踏まえて、
今回のコマンドラインの「^.* \([0-9]*\)%.*$/\1」の部分を細かく解説すると、

正規表現 説明
^.* 先頭から任意の1文字の繰り返しを指す。
\([0-9]*\)% 数字1桁の後に0回以上の数字の繰り返したあとに%がくる部分を指す。
また%の前の数字部分をグループ化する。
.*$ 任意の1文字で始まり行の末尾までを指す。 
\1 グループ化した[0-9]*の部分を指す

 
つまりは、
 
sed ‘s/^.* \([0-9]*\)%.*$/\1/’

「 ^.* \([0-9]*\)%.*$ 」を「 \1 」に置換

「(あらゆる文字列や数字)(数字何桁でも)%(あらゆる文字列や数字)」 を「 (数字何桁でも)」に置換
 
例えばsedの部分には以下のような行(dfコマンドの結果)が渡されると、67に置換される。
「/dev/mapper/rootvg-varlv   2064656   1296468    663332  67%  /var 」 を「67」 に置換
 
ちなみに、そもそも分かりづらいsedコマンドを使わずに、cutコマンドやawkコマンドで区切り文字で区切って使用率のパーセントの部分だけ抜き出して処理をする方法(こちらを参照)があるが、これは今回使えない。なぜならば、デバイス名が長いと以下のようにdfコマンドの結果が2行で表示されてしまうからである。
 
1行の場合
/dev/mapper/rootvg-varlv   2064656   1296468    663332  67%  /var
2行の場合
/dev/mapper/vg_datavg-lv_data01
                                            508                     17          466    4% /data
 
つまり時と場合により使用率が左から何番目のフィールドになるかが分からないため上記のようなsedコマンドを使用している。
 
※追記
前から数えると変わるが、後ろから数えれば2番目のフィールドであるいうことは変わらないということに後になって気がつきました。後ろから数えて何番目は、awkでいけます。awkで後ろから2番目の使用率のフィールドを抜き出して、sedコマンドで%を取り除けばOKです。こっちのほうが分かりやすいかも。ちなみにNFはawkの組み込み変数でフィールド数が格納されます。つまりNF-1で後ろから2番目のフィールドを指定できる。

【フローチャート】

スポンサーリンク
勉強wikiの下部広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
勉強wikiの下部広告

コメントをどうぞ

メールアドレスが公開されることはありません。

CAPTCHA