我在日志发送时间和接收时间中有两个字段以毫秒为单位,我必须找到这两个字段之间的差异,如果大于 2 秒,则使用 shell 脚本或 Linux 命令打印这些日志。
2017-01-27 object1(sendtime-1486743904359 ,recdtime- 1486743904500)
2017-01-27 object2(sendtime-1486743904800 ,recdtime- 1486743908000)
我的日志文件还包含其他行,我需要根据上述发送/接收时间条件过滤掉这些行,并且仅包含包含“sendobject”关键字的日志。其他如发送的请求、收到的请求应被忽略
日志详细信息--
2017-01-27 [Info]Delta Cache sendobject (empId-emp1, joindate-456,dealdate-123,sendtime-1527348020000 ,recdtime-1527348028000, salary-1k,amtpaid-EUR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp2, joindate-456,dealdate-123,sendtime-1527348073000 ,recdtime-1527348074000, salary-1k,amtpaid-AUD)
2017-01-27 [Info]Requestsent| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp3, joindate-456,dealdate-123,sendtime-1527349111000 ,recdtime-1527349112000, salary-1k,amtpaid-GBP)
2017-01-27 [Info]Delta Cache sendobject (empId-emp4, joindate-456,dealdate-123,sendtime-1527349370000 ,recdtime-1527349375000, salary-1k,amtpaid-CAD)
2017-01-27 [Info]Requestrecicved| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp6, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]DBupdated| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
答案1
和awk
你一起可以这样做:
awk -F"[- ,)]" '$(NF-1)-$5 >2000' infile
2017-01-27 object2(sendtime-1486743904800 ,recdtime- 1486743908000)
这里我们定义了一组连字符、空格、逗号和右括号作为字段分隔符。
要回答修改后的问题,请尝试:
awk -F"[- ,]" '/sendobject/ && $18-$15 >2000' infile
答案2
一个变体@αГsнιη 的回答:
awk -F'(sen|rec)dtime-' 'NF==3 && $3 - $2 > 2000'
或者,如果日志除了这些行之外还包含各种行,则您在将输入与以下内容匹配时可能会受到更多限制perl
:
perl -ne 'print if m{
^\d{4}-\d\d-\d\d\s+
object\d+\(
sendtime-(\d+)\s*,
recdtime-\s*(\d+)
\)$}x && $2 - $1 > 2000'