我有一个大文件,它是使用某些来源的实时数据创建的。 它的时间戳如下(直到纳米精度)
YYYYMMDD-HH:MM:SS.000000000 some data1
YYYYMMDD-HH:MM:SS.000000100 some data Error
YYYYMMDD-HH:MM:SS.000000200 some data2
实际日志文件
20170524-09:15:00.859733997 RequestType:HI|OrderID:150|ErrorCode:100107
20170524-09:15:00.860863250 RequestType:HELLO|OrderID:153|Tok:0
20170524-09:15:00.861469371 RequestType:BYE|OrderID:153|Tok:1
20170524-09:15:00.959733997 RequestType:HI|OrderID:158|ErrorCode:100107
如何从1个文件中逐行读取并写入另一个文件(写入速度为〜微秒)
我需要通过读取完整日志文件并将其打印到不同的文件(每微秒每行)来模拟实时环境,以便我可以模拟实时环境。
实时环境中的这个文件附加得非常快(从时间戳可以看出)
**#Background info of the problem :**
(可以忽略,只是写作,因为SO用户可能会写为什么你在做什么并将其投票给它)::
我一直在使用脚本来计算“微小”的错误。
例如,在上面的日志9:15中将有2个错误,依此类推。
在实时环境中,我在文件上连续尾(文件将会非常大),并运行以下命令
tail -f $logfile | stdbuf -oL awk '/ErrorCode:100107/{key=$2":"$3;a[key]++} !/ErrorCode:100107/{LK=$2":"$3; if (LK != key && key){print key,a[key];delete a;key=""};system("")}' FS='[-:]'
今天剧本由于某种原因而被绞死,因此我想创建一个模拟。
如果我的代码中有任何错误,请进行评论。我只构建了存储错误计数的a
哈希,如果分钟已经更改,则打印前一分钟计数。
答案 0 :(得分:1)
我认为您的脚本使用数组a[]
存在潜在问题,以跟踪错误数量并仅在特定情况下删除它。它可能会填补当天几乎每分钟的计数。尽管如此,阵列是完全没有必要的,所以我只是一眼就看出来了,我并没有过多地考虑逻辑。
关于拖尾部分的idk,但要做你想要的awk脚本做的事情就是:
$ awk -F'[-:]' '{curr=$2":"$3} curr!=prev{if(cnt) print prev, cnt; cnt=0; prev=curr} /ErrorCode:100107/{cnt++} END{if (cnt) print prev, cnt}' file
09:15 2
如果您需要fflush()
之后,如果您需要system("")
,请添加print
(或_title_changed
。
答案 1 :(得分:-2)
只需将读取放入带睡眠的循环中,然后将其发送到新的日志文件:
while read line; do
echo $line
sleep 0.001
done < logfile.log > newlogfile.log &