ラベル Shell Script の投稿を表示しています。 すべての投稿を表示
ラベル Shell Script の投稿を表示しています。 すべての投稿を表示

2015-09-14

ログファイルから指定範囲のタイムスタンプが付いた行を切り出す

ログファイルのタイムスタンプが
2015-09-14T02:29:05+00:00 ....
の様な形式だとして、5分前以降のログを切り出すならば次のような具合でいけます

$ awk -v from=$(date '+%Y-%m-%dT%H:%M:%S' -d '5 minute ago') -F+ 'from < $1' /var/log/hoge.log
5分前から1分前までだとしたらこんな具合
awk -v from=$(date '+%Y-%m-%dT%H:%M:%S' -d '2 minute ago') -v to=$(date '+%Y-%m-%dT%H:%M:%S' -d '1 minute ago') -F+ 'from < $1, to <= $1' /var/log/hoge.log

2014-12-15

シェルスクリプトで、現在の関数名と呼び出し元の関数名を参照する

${FUNCNAME[0]}で現在実行中の関数名

${FUNCNAME[1]}で呼び出し元の関数名を参照できる

サンプルコードはこんな感じ
#! /bin/sh
func1(){
 echo ${FUNCNAME[0]}
 echo ${FUNCNAME[1]}
}

func2(){
 echo ${FUNCNAME[0]}
 echo ${FUNCNAME[1]}
}

caller(){
 func1
 func2
}

caller

実行すると
$ ./test.sh 
func1
caller
func2
caller

2014-09-10

ログファイルに指定の文字列が指定回数出力されたらイベントを発生させる

/var/log/messagesにerrorという文字列が3回出力されたら"Detect!"という文字を出力させる場合だとこんな感じ

str="error";threshold=3;count=0;tail -n 0 -F /var/log/messages | while read i;do echo $i | grep -q $str && count=`expr $count + 1` && test $count -ge $threshold && echo 'Detect!' && break; done

→ちょっと改善 2015-03-20 ※簡略化&条件達成時に即プロンプトが戻るように
str="error";threshold=3;c=0;while read i;do [[ $i =~ $str ]] && ((c++)) && [[ $c -ge $threshold ]] && echo 'Detect!' && break; done< <(tail -n 0 -F /var/log/messages)
これを実行しつつ、別のところで
logger "test error"
logger "test error"
logger "test error"
と3回出力すると、"Detect!"と表示されましたヾ(*・∀・)ノ"