- PR -

指定した日付でlogを切り取る方法

投稿者投稿内容
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-08-04 18:32
引用:

log.2からも取得でき、なおかつタイムスタンプが早い時間順に整列させることというのは可能なのでしょうか?
(つまりログ番号が後ろのものから順にログを取得する)


log.1 と log.2 の時間的な関係がよくわかりませんが、
これでどうですか?
コード:
#!/bin/sh

LANG=C

today=`date +'%Y %b %d'`
tomorrow=`date --date '-1 days ago' +'%Y %b %d'`

end_row=`ls -tr log.* | xargs cat | grep -n "$today" | head -1 | perl -pe 's/:.+//g'`
start_row=`ls -tr log.* | xargs cat | grep -n "$tomorrow" | head -1 | perl -pe 's/:.+//g'`

if [ "$start_row" = "" ]; then
        start_row=`ls -tr log.* | xargs cat | wc -l | awk '{print $1+1}'` # $1は半角にしてください
fi

start_row=`expr $start_row - 1`

t_row=`expr $start_row - $end_row + 1`
h_row=`expr $start_row + 1`

ls -tr log.* | xargs cat | head -$start_row | tail -$t_row

exit


coltrain
常連さん
会議室デビュー日: 2005/05/20
投稿数: 21
投稿日時: 2006-08-04 18:44
早速ためしてみました。

xargs: cat: terminated by signal 13
xargs: cat: terminated by signal 13
xargs: cat: terminated by signal 13

という文言がでます
処理結果としては以前とおなじく、
1ログ分のものしか取得できませんでした

logがある容量までいくと
log.1
へリネームされて保管されていき
またlogがある容量までいくと

log → log.1
log.1 → log.2
というふうにリネームされて保管されてゆきます。


[ メッセージ編集済み 編集者: coltrain 編集日時 2006-08-04 19:17 ]
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-08-04 19:19
引用:

coltrainさんの書き込み (2006-08-04 18:44) より:
早速ためしてみました。

xargs: cat: terminated by signal 13
xargs: cat: terminated by signal 13
xargs: cat: terminated by signal 13

というエラーがでてしまいました、、、

logがある容量までいくと
log.1
へリネームされて保管されていき
またlogがある容量までいくと

log → log.1
log.1 → log.2
というふうにリネームされて保管されてゆきます。



たぶんcatで結合した結果が大きくなりすぎているのだと思います。
残念ながら別の手段を考える必要がありそうです。
ですが、今日はもう帰宅する予定なので土日に知恵をしぼってみます。
(できないかも知れませんが...)
coltrain
常連さん
会議室デビュー日: 2005/05/20
投稿数: 21
投稿日時: 2006-08-08 14:00
ファイル検索の件なのですが
あらかじめファイルを結合しておいて、
検索をかければ正しく取得することができることがわかりました
ありがとうございます。

最後にもう一つだけ解決したいことがあるのですが

today=`date +'%Y %b %d'`
tomorrow=`date --date '-1 days ago' +'%Y %b %d'`

の箇所で
todayに欲しいデータの日付
tommorrowにその翌日の日付
を入力すれば
todayに入力された日付のデータを取得することができるのですが、
この場合にもしtodayの翌日にデータが発生していない場合に
tomorrowにそのデータ発生していない翌日の日付をいれると
うまく検索することができません。
(もちろん翌日以降にデータが発生した日付を入力すれば正しく
検索されますが)

↑のようなことを防ぐためにこのtomorrowの項目になんとか
”翌日以降のデータが発生した日”のような日付を
設定させることはできないでしょうか?

よろしくお願いいたします
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-08-08 16:17
引用:

あらかじめファイルを結合しておいて、
検索をかければ正しく取得することができることがわかりました


そーか。その手がありましたね。

引用:

today=`date +'%Y %b %d'`
tomorrow=`date --date '-1 days ago' +'%Y %b %d'`

の箇所で
todayに欲しいデータの日付
tommorrowにその翌日の日付
を入力すれば
todayに入力された日付のデータを取得することができるのですが、
この場合にもしtodayの翌日にデータが発生していない場合に
tomorrowにそのデータ発生していない翌日の日付をいれると
うまく検索することができません。
(もちろん翌日以降にデータが発生した日付を入力すれば正しく
検索されますが)

↑のようなことを防ぐためにこのtomorrowの項目になんとか
”翌日以降のデータが発生した日”のような日付を
設定させることはできないでしょうか?

よろしくお願いいたします



こんな風にして、翌日以降の日数を計算すればいいかな?
一部「'」を「"」にしてます。
結合したファイル名がわからないので、all_logにしています。
コード:
# 翌日以降の日数を計算します
cnt=1
while [ 1 ]; do
        tomorrow=`date --date "-$cnt days ago" +'%Y %b %d'`
        grep "$tommorow" all_log > /dev/null
        if [ $? = 0 ]; then
                break;
        fi
        cnt=`expr $cnt + 1`
        if [ $cnt = 100 ]; then
                echo "100日経ってもログがないので終了します"
                exit;
        fi
done

today=`date +'%Y %b %d'`
tomorrow=`date --date "-$cnt days ago" +'%Y %b %d'`



coltrain
常連さん
会議室デビュー日: 2005/05/20
投稿数: 21
投稿日時: 2006-08-09 19:01
ありがとうございます!

すいません
例えば
"2006 Aug 02"
の翌日以降の日付計算をするばあいは
どこの数値をこれに入れ替えればよろしいのでしょうか?

ほんとうに初心者な質問ですいませんがよろしくおねがいいたします
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-08-10 13:29
ひらめいたので、投稿します。
これで当初の目的を達成できませんか?
コード:

#!/bin/sh

LANG=C

tmpfile=all_log
ls -tr log.* | xargs cat > $tmpfile

cutlog () {
today=$1 # $1は半角にしてください
tomorrow=$2 # $2は半角にしてください

if [ "$today" = "$tomorrow" ]; then
return
fi

# 出力ファイル名
out_file=`echo $1 | perl -pe 's/ /_/g'` # $1は半角にしてください
if [ -f $out_file ]; then
echo $out_file "skip"
return
fi

end_row=`grep -n "$today" $tmpfile | head -1 | perl -pe 's/:.+//g'`
start_row=`grep -n "$tomorrow" $tmpfile | head -1 | perl -pe 's/:.+//g'`

start_row=`expr $start_row - 1`

t_row=`expr $start_row - $end_row + 1`
h_row=`expr $start_row + 1`

head -$start_row $tmpfile | tail -$t_row > $out_file
}

datelist=dlist
awk '{print $1,$2,$3}' all_log | grep ^2 | uniq > $datelist # $1,$2,$3は半角に
lcnt=`awk '{print $1,$2,$3}' all_log | grep ^2 | uniq | wc -l` # $1,$2,$3は半角に
cnt=1
while [ 1 ]; do
param1=`head -$cnt $datelist | tail -2 | head -1`
param2=`head -$cnt $datelist | tail -1`

cutlog "$param1" "$param2"

cnt=`expr $cnt + 1`
if [ $cnt -gt $lcnt ]; then
break;
fi
done

rm -f $tmpfile $datelist

exit



# $1,$2,$3を半角のまま投稿してしまいました


[ メッセージ編集済み 編集者: 温州蜜柑 編集日時 2006-08-10 14:00 ]

[ メッセージ編集済み 編集者: 温州蜜柑 編集日時 2006-08-13 20:44 ]
coltrain
常連さん
会議室デビュー日: 2005/05/20
投稿数: 21
投稿日時: 2006-08-14 15:49
本当にすばらしいシェルをありがとうございます!
すべて解決しました^^

スキルアップ/キャリアアップ(JOB@IT)