每隔一行打印一行文件

时间:2017-05-24 11:33:23

标签: bash awk file-writing

我有一个大文件,它是使用某些来源的实时数据创建的。 它的时间戳如下(直到纳米精度)

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哈希,如果分钟已经更改,则打印前一分钟计数。

2 个答案:

答案 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 &