从日志文件中提取日期

时间:2014-12-11 14:29:47

标签: bash date awk grep

我有一个这样的日志行:

Tue Dec  2 10:03:46 2014 1 10.0.0.1 0 /home/test4/TEST_LOGIN_201312021003.201412021003.23872.sqlLdr b _ i r test4 ftp 0 * c

我可以像这样打印这行的日期值。

echo $log | awk '{print $9}' | grep -oP '(?<!\d)201\d{9}' | head -n 1

我有另一个这样的日志行,如何打印日期值?

Tue Dec  9 10:48:13 2014 1 10.0.0.1 80 /home/DATA1/2014/12/11/16/20/blablabla_data-2014_12_11_16_20.txt b _ i r spy ftp 0 * c

我尝试了我的awk / grep解决方案,但在看到2019后会打印201201个数字。

子文件夹和数据名称相同:

2014/12/11/16/20 --> 11 Dec 2014 16:20 <-- blablabla_data-2014_12_11_16_20.txt

注意:/home/DATA1不是静态的。 year/month/day/hour/minute是静态的。

2 个答案:

答案 0 :(得分:2)

由于路径中的格式为/.../YYYY/MM/DD/HH/MM/filename,您可以使用201D/DD/DD/DD/DD表达式中的grep来匹配日期块:

$ log="Tue Dec  9 10:48:13 2014 1 10.0.0.1 80 /home/DATA1/2014/12/11/16/20/blablabla_data2_11_16_20.txt b _ i r spy ftp 0 * c"
$ echo "$log" | grep -oP '(?<!\d)201\d/\d{2}/\d{2}/\d{2}/\d{2}'
2014/12/11/16/20

最后使用tr删除斜杠:

$ echo "$log" | grep -oP '(?<!\d)201\d/\d{2}/\d{2}/\d{2}/\d{2}' | tr -d '/'
201412111620

答案 1 :(得分:1)

如果您熟悉它,也可以使用sed

echo "Tue Dec  9 10:48:13 2014 1 10.0.0.1 80 /home/DATA1/2014/12/11/16/20/blablabla_data-2014_12_11_16_20.txt b _ i r spy ftp 0 * c"|sed  's#.*[[:alnum:]]*/\([[:digit:]]\{4\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}\).*#\1#'

输出

2014/12/11/16/20

要删除&#34; /&#34;,上述相同命令通过管道传送到tr -d '/'

完整命令行

echo "Tue Dec  9 10:48:13 2014 1 10.0.0.1 80 /home/DATA1/2014/12/11/16/20/blablabla_data-2014_12_11_16_20.txt b _ i r spy ftp 0 * c"|sed  's#.*[[:alnum:]]*/\([[:digit:]]\{4\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}/[[:digit:]]\{2\}\).*#\1#'|tr -d '/'

输出

201412111620