使用awk从日志文件中查找模式

时间:2014-07-02 13:19:02

标签: awk

[QFJ Timer]:2014-07-02 06:19:09,030:bla.all.com.bla.bla.ppp.xxx.abcsedf:

我想提取日期和时间。 所以日期没问题:

cat bla.log |awk -F: '{print $2}'|awk '{print $1}'

现在问题在于时间问题。 如果我这样做:cat bla.log |awk '{print $3}'所以我得到:

06:19:09,030:bla.all.com.bla.bla.ppp.xxx.abcsedf:

这意味着我需要另一个grep吗?

但我做了很多尝试同时使用'FS'并且没有得到时间。

有人可以提出建议吗?

谢谢。

4 个答案:

答案 0 :(得分:2)

在awk的GNU版本中FS可以是正则表达式:

echo "[QFJ Timer]:2014-07-02 06:19:09,030:bla.all.com.bla.bla.ppp.xxx.abcsedf:" |
awk -vFS=":|," '{ print $2":"$3":"$4;}'

吐出

2014-07-02 06:19:09

您的左侧分隔符为“:”,右侧为“,”,不幸的是,小时,分钟和秒也由左侧分隔符分隔。这可以通过打印3美元和4美元来解决。快速而肮脏的解决方案,但它不会非常强大。

答案 1 :(得分:1)

您可以将sed用于此目的,

$ echo '[QFJ Timer]:2014-07-02 06:19:09,030:bla.all.com.bla.bla.ppp.xxx.abcsedf:' | sed 's/^[^:]*:\([^,]*\).*/\1/g'
2014-07-02 06:19:09

答案 2 :(得分:0)

cat bla.log |awk -F":" '{print $2":"$3":"$4}' | awk -F"," '{print $1}'

哪个可以帮到你:

2014-07-02 06:19:09

答案 3 :(得分:0)

您可以使用grep,因为它的意思是:

grep -o '[0-9]\{4\}\(-[0-9]\{2\}\)\{2\}\(\( \|:\)[0-9]\{2\}\)\{3\}' log.file

或更简单一点,egrep

egrep -o '[0-9]{4}(-[0-9]{2}){2}(( |:)[0-9]{2}){3}' log.file