1

我有类似的条目

[NGS|00219|17-10-2012 19:05:43:977|INFO]

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

4

7 回答 7

3

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

awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt
于 2012-10-18T06:37:00.183 回答
2

当然有很多方法——使用cut,seduniq:

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

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

或者,仅使用sedand uniq

 sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq
于 2012-10-18T06:18:27.060 回答
2

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

#!/bin/bash

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

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

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

于 2012-10-18T06:19:24.790 回答
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() 来删除日期部分来完成的。

于 2012-10-18T06:20:13.697 回答
1

也许不是最优雅的:

awk '{print $2}' log.txt | cut -c 1-8 | uniq
于 2012-10-18T06:19:03.363 回答
1

类似于 egrep 命令,你可以使用 grep 如下:

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

于 2012-10-18T08:09:53.590 回答
0

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

egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq
于 2012-10-18T06:38:56.847 回答