用于从文件中读取行(调用数据)并为每个调用创建输出文件的工具或脚本

时间:2017-03-23 22:20:55

标签: loops awk sed grep readline

我是PBX管理员而不是编码员,但我正在尝试弄清楚如何使用for循环和某些工具(grep / awk / {{1} } /?)读取呼叫记录日志文件( cdrLog-D0202017.txt )中的行,并为每个调用生成一个文本文件。 所有呼叫数据都是顺序的,呼叫以“ CDR BEGIN ”行开头,然后是一些带有呼叫事件的行,然后用“ CDR END ”行结束该呼叫。 我在Windows CMD脚本中,但会将日志移动到我可以创建解决方案的任何位置。

我已尝试使用sedgrep找到“ CDR BEGIN ”并认为我可以计算循环中下一个行的行数然后输出从第一个“ CDR Begin ”到下一个的所有行。到目前为止,我只是在困惑自己。我意识到 REGEX find可能是更好的方法。如果有人有建议,我正在寻找正确方向的指针。我想我可能会在有更好的工具时尝试锤子和锯子。

每天的日志文件中有数千条这些通话记录。我想将每个记录输出到自己的文件中,该文件由调用中的某些数据命名,如 time (示例 021817-235835.call ) - 基本上我正在尝试从串行记录的数据中调用数据对象。

来自日志文件的示例呼叫数据记录(这些是Windows创建的平面ACSII文件):

awk

2 个答案:

答案 0 :(得分:1)

在awk中:

$ awk '
/^===== CDR BEGIN/ { f=$0; gsub(/[^0-9]/,"",f) }   # output filename is all digits from BEGIN
f{ b=b (b==""?"":ORS) $0 }                         # when flag up all records to buffer
/^===== CDR END/ { print b > f; close(f); b=f="" } # output and reset variables
' file
$ ls 
021817235835994
file

变量f充当收集输出和文件名持有者记录的标志。不确定是否真的需要标志,因为你只发布了1个CDR而且我不知道CDR之间是否有任何需要被淘汰的东西。通过从CDR BEGIN记录中删除所有非数字来创建文件名。 b是记录输出的缓冲区。

答案 1 :(得分:1)

您可以根据需要更多地使用此文件来获取文件名,但是应该让您继续:

awk '/CDR BEGIN/{out=gensub(/[[:punct:]]/,"","g",$5 $6)".call"}{print > out}' your_file

这将产生如下文件:

021817235835994.call

代码只是在每次点击" CDR BEGIN"字符串,然后从第五和第六项中删除所有标点符号,即日期和时间。然后输出到您的新文件名

是一个简单的例子