用于标识日期的Bash脚本

时间:2014-08-13 18:12:43

标签: bash date

我正在尝试解析我的/ var / log / messages。我需要一个可以验证前15个字符是否为日期的脚本。它时不时地包含一条像"---------------"这样的线,它会让一切都变得混乱。

典型的/ var / log /消息如下所示:

Aug 12 13:22:33 xxxxxxx xxxxx xxxxx

我的bash脚本试图取出前6个字符并将其标识为日期

if date -d "${line:0:3} ${line:4:2}" ; then 

这样可以正常工作并识别日期,但如果该行是一堆-----,它也会将其标识为日期。

如何查看该行是否以日期开头?

4 个答案:

答案 0 :(得分:4)

检查该行的开头是否为日期:

line="Aug 12 13:22:33 xxxxxxx xxxxx xxxxx"
if [[ $line =~ ^([[:alpha:]]{3} +[[:digit:]]{1,2} [:[:digit:]]{8}) ]]; then 
    echo "${BASH_REMATCH[1]}"
fi
Aug 12 13:22:33

答案 1 :(得分:3)

您可以检查以----开头的行:

[[ "$line" != "----"* ]] && if date -d "${line:0:3} ${line:4:2}" ; then

答案 2 :(得分:2)

这是一个严格的比较:

if [[ $line =~ ^[A-Z][a-z]{2}\ {1,2}[0-9]{1,2}\ [0-9]{2}(:[0-9][0-9]){2} ]]; then
    echo "$BASH_REMATCH"
fi

答案 3 :(得分:1)

如果您安装了perl,请安装Date::Manip,您的脚本将变为:

#!/bin/sh
export PERL=/usr/bin/perl
$PERL -MDate::Manip -e 'Date_init(); return 1 if parseDate($_); return 0;' $*