使用awk标准化日志数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用awk标准化日志数据相关的知识,希望对你有一定的参考价值。

Hellow伙计们!

我正在从需要提交给管理人员的日志文件中解析数据。日志遵循以下结构:

USER    DATE    LOGIN
USER    DATE    LOGIN       *single tab between DATE and LOGIN
USER    DATE        LOGOUT  *double tab between DATE and LOGIN
USER    DATE    LOGIN       
USER    DATE        LOGOUT  
USER    DATE    LOGIN       
USER    DATE        LOGOUT  
USER    DATE        LOGOUT  
USER    DATE        LOGOUT  

几乎所有内容都已经达到我需要的格式,例如:

adriana 20200101    10:20:00
adriana 20200101    10:30:00
adriana 20200101        10:40:00

连续两次登录意味着连接丢失。现在,我们不知道连续注销对调查意味着什么。

我需要对此数据进行一点标准化,以便在我编写的其余脚本中更有用。

我需要:

对于相同的用户和日期,在连续的LOGINS上:在每个事件之间添加一个新行,具有与前一行相同的内容,但是将LOGIN替换为LOGOUT。对于相同的USER和DATE,在连续的LOGOUTS上:在每个事件之间添加一个新行,并具有与前一行相同的内容,但将LOGOUT替换为LOGIN。

示例:

adriana 20200101    10:20:00
adriana 20200101    10:30:00
adriana 20200101        10:40:00
adriana 20200101        10:50:00

应成为:

adriana 20200101    10:20:00
adriana 20200101        10:20:00
adriana 20200101    10:30:00
adriana 20200101        10:40:00
adriana 20200101    10:40:00
adriana 20200101        10:50:00

我正在尝试使用AWK进行此操作,但是我不确定这是否是正确的工具。直到现在,我一直手动进行操作,但是在第3000行之后,我很累。还有12,000行。

有人可以协助我指出我要学习的方向吗?

提前感谢!

答案

awk进行救援!

$ awk 'BEGINFS=OFS="\t" 
       p==NFprint p1, (p==2?OFS:"") pn1; 
            p=NF; pn=$NF; p1=$1' file

adriana 20200101        10:20:00
adriana 20200101                10:20:00
adriana 20200101        10:30:00
adriana 20200101                10:40:00
adriana 20200101        10:40:00
adriana 20200101                10:50:00

以上是关于使用awk标准化日志数据的主要内容,如果未能解决你的问题,请参考以下文章

sh AWK - 标准用途

AWK从入门到精通

awk简介与表达式实例

在 Celery 中使用 Python 标准日志记录

tzselect - 选择一个时区

不看绝对后悔的Linux三剑客之awk实战精讲