- PR -

date grep for & スクリプトの使いこなし

1
投稿者投稿内容
八兵衛
会議室デビュー日: 2004/12/20
投稿数: 18
投稿日時: 2005-01-05 11:33
下記の様にファイルを2つ作りました。
sys.logはログファイルで、test.shはログファイルの中でパソコン日付のログを抽出するスクリプトです。

sys.logの特徴として、日付けが1桁の時に月名と日付けの空白が2つあり、日付けが2桁の時はそれが1つとなります。

パソコンの日付けを1/15とした場合は
Jan 15,38
を抽出するのですが、1/5とした場合は、何も抽出しません。

疑問@
1/5の場合、Jan 5,16を抽出しないのはなぜでしょう?
3行目の処置で日付けが1桁でも空白が追加されるはず。ターミナルでは追加されます。

疑問A
18-19行目間に、$MESをファイルに落としたところ、全ての空白が抜けます。
$MESが、Jan15とかJan5とかなります。

以上、お返事お待ちしております。(Redhat Linuxを使用)

------ 記 --------
<ファイル:sys.log>
Jan 5,16 ⇒Janと5の間は空白2文字
Jan 15,38 ⇒Janと15の間は空白1文字

<ファイル:test.sh>
1:#!/bin/bash
2:TDAYM=`date +%m`
3:TDAYD=`date +%_d` ⇒日付けが1桁の場合に空白1文字入れる為、アンダースコアです。
4:case $TDAYM in
5: '01')TDAYM="Jan ";; ⇒月名の後に空白1文字入れてます。以下同じ。
6: '02')TDAYM="Feb ";;
7: '03')TDAYM="Mar ";;
8: '04')TDAYM="Apr ";;
9: '05')TDAYM="May ";;
10: '06')TDAYM="Jun ";;
11: '07')TDAYM="Jul ";;
12: '08')TDAYM="Aug ";;
13: '09')TDAYM="Sep ";;
14: '10')TDAYM="Oct ";;
15: '11')TDAYM="Nov ";;
16: '12')TDAYM="Dec ";;
17:esac
18:MES=`echo $TDAYM$TDAYD`
19:for SET in `cat /var/log/sys.log |grep "$MES"` ⇒複数ファイル対応の為、catを使用
20:do
21: echo "$SET" >>/var/log/today.log
22:done

[ メッセージ編集済み 編集者: 八兵衛 編集日時 2005-01-05 11:41 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-01-05 12:48
空白の処理(欧文では普通、HTML表示でもおなじみ)では
MES=-$TDAYM-$TDAYD-
12:47:10 ~
echo -$MES-
--Jan - 5--
12:47:15 ~
MES=-$TDAYM$TDAYD-
12:47:31 ~
echo -$MES-
--Jan 5--
12:47:35 ~
Cygwin ではこうです。
---------------------------- 訂正
文字列連結で echo `〜` を動かす必要はない
(ここで空白の正規化が入ってしまう)。
echo "$MES"
で正規化前の文字列が見える。
正解は echoの実行を取り除く
MES=$TDAYM$TDAYD

[ メッセージ編集済み 編集者: MMX 編集日時 2005-01-05 14:08 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-01-05 13:19
コード:
#!/bin/sh


day=`date +%d`
day=`echo $day | sed 's/^0//g'`
mon=`date +%m`

case $mon in
'01') mon="Jan" ;;
'02') mon="Feb" ;;
'03') mon="Mar" ;;
'04') mon="Apr" ;;
'05') mon="May" ;;
'06') mon="Jun" ;;
'07') mon="Jul" ;;
'08') mon="Aug" ;;
'09') mon="Sep" ;;
'10') mon="Oct" ;;
'11') mon="Nov" ;;
'12') mon="Dec" ;;
esac

grep "^$mon[ ][ ]*$day " sys.log




[ メッセージ編集済み 編集者: コブラ 編集日時 2005-01-05 14:16 ]
八兵衛
会議室デビュー日: 2004/12/20
投稿数: 18
投稿日時: 2005-01-05 14:09
MMXさん、ご回答ありがとうございます。
文法の違いか、残念ながらエラーになってしまいました。

コブラさん、ご回答ありがとうございます。
私の記述ミスかもしれませんが、
grep "^$mon[ ][ ]*$day " sys.log
で、データを抽出できませんでした。
day=`echo $day | sed 's/0//g'`
ですが、10日や20日が1日や2日になってしまいませんでしょうか?

私の方で試してみたのですが、
18:MES=`echo $TDAYM$TDAYD`

MES=`date +%bバックスラッシュ %_d`
でうまくいきました。
もう少しチェックしますが、これで良さそうでしょうか?
良さそう、ダメそう、何か言えそうでしたらお願いいたします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-01-05 14:17
あ〜、そうですね。
10 とか 20 は 1 とか 2 になってまいますな。

修正しときました (プ
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-01-05 14:25
ふむ。
キッチリやるには、こうするべきでしょうな。

コード:
#!/bin/sh

day=`date +%d`
day=`echo $day | sed 's/^0//g'`
mon=`date +%m`

case $mon in
    '01') mon="Jan" ;;
    '02') mon="Feb" ;;
    '03') mon="Mar" ;;
    '04') mon="Apr" ;;
    '05') mon="May" ;;
    '06') mon="Jun" ;;
    '07') mon="Jul" ;;
    '08') mon="Aug" ;;
    '09') mon="Sep" ;;
    '10') mon="Oct" ;;
    '11') mon="Nov" ;;
    '12') mon="Dec" ;;
esac

grep "^$mon[ ][ ]*$day[,\/]" sys.log

1

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