私のログファイルを処理する必要があります/var/log/mylogs.log
。私は新しいエントリだけに興味がありますが、Jul 20 15:00:00
ログには以前のエントリも含まれているからです。
cat
特定の日付より古い項目だけを入力する簡単な方法はありますか?
答え1
日付を解析するための小さなスクリプトを書くことができますbash
。date
#!/usr/bin/env bash
## Your date threshold
limit="Jul 20 15:00:00"
## Your limit in seconds since the UNIX epoch
limit_seconds=$(date -d "$limit" +%s)
while read line; do
## Extract the date and convert to seconds since epoch for comparison
date=$(date -d "$(echo "$line" | cut -d ' ' -f -4)" +%s);
## Is this newer than the limit? If yes, print the line
if [ "$date" -ge "$limit_seconds" ]; then
echo "$line"
fi
done
このスクリプトをパス(たとえば/usr/local/bin/parse_log.sh
)に保存してから、次のように実行できます。
parse_log.sh < /var/log/mylogs.log
答え2
Perlを使用してこれを行うことに興味があるかもしれません。
perl -wlne '/^Jul\ 20\ 15\:00\:00/ .. eof() and print' /path/to/logfile.txt
特定の要件に合わせて正規表現を調整する必要があります。
答え3
日付を簡単に操作できる言語でこれを行うのが最善です。各ログ行はmmm dd HH:MM:SS
日付形式で始まり、すべてのログエントリが現在の年のものであると仮定します。
<var/log/mylogs.log perl -MDate::Parse -e '
$cutoff = str2time($ARGV[0]);
while (<STDIN>) {
print if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
str2time($1) <= $cutoff
}
' 'Jul 20 15:00:00'
このコードスニペットは、前の日付を持つすべての行を印刷します。最新の項目が必要な場合は、比較を逆にしてください(str2time($1) >= $cutoff
)。古いアイテムを印刷するときにアイテムが遅すぎる場合は、すぐに終了して処理時間を節約できます。
<var/log/mylogs.log perl -MDate::Parse -e '
$cutoff = str2time($ARGV[0]);
while (<STDIN>) {
exit if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
str2time($1) > $cutoff;
print;
}
' 'Jul 20 15:00:00'
答え4
また、sedを試してください:
sed -n '/^Jul\ 20\ 15\:00\:00/,/eof()/p' /path/to/logfile.txt