从日志文件linux grep中查找唯一的时间

时间:2012-10-18 06:03:09

标签: linux shell grep

我有像

这样的条目
[NGS|00219|17-10-2012 19:05:43:977|INFO]

在我的日志文件中,如何使用grep或其他linux shell工具在此日志文件中找到唯一的时间值(不包括毫秒)

7 个答案:

答案 0 :(得分:3)

这是打印独特时间的一种方法:

awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt

答案 1 :(得分:2)

当然,有很多方法 - 如何使用cutseduniq

 cut -d' ' -f2 logfile | sed -e 's/:[^:]*$//' | uniq

(只取空格后的内容,删除从最后一个冒号到结尾的所有内容,然后删除重复内容。)

或者,只使用seduniq

 sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq

答案 2 :(得分:2)

此脚本为您提供所有唯一的时间戳(仅限时间;不包括日期。所有重复的时间戳都将被忽略):

#!/bin/bash

awk -F'[: ]' '{print $2 ":" $3 ":" $4}' | sort | uniq -u

sort的使用是可选的(因为我假设日志是按时间顺序排列的)

如果您想要找到这些时间戳的整行,请告诉我。

答案 3 :(得分:2)

这在awk中非常简单

awk -F'|' '{  
              split($3, a, / /);
              sub(/:[[:digit:]]+$/, "", a[2]); 
              arr[a[2]] = 1; 
           } END { 
              for (i in arr) 
                 print i 
           }' file.log

您可以使用sub()函数删除毫秒,然后将该值作为键添加到数组中。由于数组键是唯一的,因此将删除任何重复项。处理完成后,END块会遍历键并打印它们。

更新答案以排除日期。这是通过在时间戳上使用split()来删除日期部分来完成的。

答案 4 :(得分:1)

也许不是最优雅的:

awk '{print $2}' log.txt | cut -c 1-8 | uniq

答案 5 :(得分:1)

与egrep命令类似,您可以按如下方式使用grep:

grep -o -E'[[:digit:]] + [:] [[:digit:]] + [:] [[:digit:]] +'NGS.log | uniq

答案 6 :(得分:0)

我自己找到了一个很好的答案

egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq