我有类似的条目
[NGS|00219|17-10-2012 19:05:43:977|INFO]
在我的日志文件中,如何使用grep
或其他 linux shell 工具在此日志文件中找到唯一的时间值(不包括毫秒)
这是打印独特时间的一种方法:
awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt
当然有很多方法——使用cut
,sed
和uniq
:
cut -d' ' -f2 logfile | sed -e 's/:[^:]*$//' | uniq
(只取空格后面的内容,删除从最后一个冒号到末尾的所有内容,然后消除重复项。)
或者,仅使用sed
and uniq
:
sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq
此脚本为您提供所有唯一时间戳(仅时间;不包括日期。所有重复的时间戳都被忽略):
#!/bin/bash
awk -F'[: ]' '{print $2 ":" $3 ":" $4}' | sort | uniq -u
排序的使用是可选的(因为我假设日志是按时间顺序排列的)
如果您想要找到这些时间戳的整行,请告诉我。
这在 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() 来删除日期部分来完成的。
也许不是最优雅的:
awk '{print $2}' log.txt | cut -c 1-8 | uniq
类似于 egrep 命令,你可以使用 grep 如下:
grep -o -E '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log|uniq
我自己找到了一个很好的答案
egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq