2022-08-07に更新

[Linux] messagesログの日付指定参照

Linuxにおける「/var/log/messages」ファイルのフォーマットは以下のように「日 時 ホスト名 情報」となっている。

Feb 16 18:00:10 web sshd[13865]: Accepted publickey for user01 
from 192.168.0.2 port 45680 ssh2

問題なのが1桁の日にちの場合以下のように「月(スペース)(スペース)日にち」の表現になっている点だ。

Feb  4 21:25:22 ホスト名 情報

「04」ならともかく「(スペース)4」と表現されることにより、
bashスクリプト等で実行日に絞り込みたい場合、以下のコマンドだと絞り込みができない。

$ LANG=C date "+%b %d"
Feb 04

以下のコマンドだと、1桁の日にちも2桁の日にちも処理できる。

$ LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"

LANG=C date「 Fri Feb 4 22:10:50 JST 2022」のような日付を取得
cut -d " " -f 2-4 「Feb 4 」に絞り込み、ただし、2桁日にちの場合時刻まで取れてしまう。
sed -e "s/ ..:.*$//" 2桁日にちの場合の時刻除去

1桁日にちのコマンド実行例

$ LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"
Feb  4

2桁日にちのコマンド実行例

LANG=C date --date '5 day ago' | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"
Jan 30

注意として変数に入れて使用する場合、変数をダブルクォート(")で囲む必要がありそうだ。
そうしないとスペースの2個が1個で処理してしまう可能性がある。

$ LOGDATE=`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"`
$ echo $LOGDATE
Feb 4
echo "$LOGDATE"
Feb  4
$

ワンライナーでの実行例 (先頭.は表現回避用)

.# cat /var/log/messages | grep "`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"`"
Feb  4 10:0:01 ホスト名 情報
Feb  4 10:0:01 ホスト名 情報

変数定義後の事項例 (先頭.は表現回避用)

.# LOGDATE=`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"`
.# cat /var/log/messages | grep "${LOGDATE}"
Feb  4 10:0:01 ホスト名 情報
Feb  4 10:0:01 ホスト名 情報
ツイッターでシェア
みんなに共有、忘れないようにメモ

dsta50

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント