我是PBX管理员而不是编码员,但我正在尝试弄清楚如何使用for
循环和某些工具(grep
/ awk
/ {{1} } /?)读取呼叫记录日志文件( cdrLog-D0202017.txt )中的行,并为每个调用生成一个文本文件。
所有呼叫数据都是顺序的,呼叫以“ CDR BEGIN ”行开头,然后是一些带有呼叫事件的行,然后用“ CDR END ”行结束该呼叫。
我在Windows CMD脚本中,但会将日志移动到我可以创建解决方案的任何位置。
我已尝试使用sed
和grep
找到“ CDR BEGIN ”并认为我可以计算循环中下一个行的行数然后输出从第一个“ CDR Begin ”到下一个的所有行。到目前为止,我只是在困惑自己。我意识到 REGEX 或find
可能是更好的方法。如果有人有建议,我正在寻找正确方向的指针。我想我可能会在有更好的工具时尝试锤子和锯子。
每天的日志文件中有数千条这些通话记录。我想将每个记录输出到自己的文件中,该文件由调用中的某些数据命名,如 time (示例 021817-235835.call ) - 基本上我正在尝试从串行记录的数据中调用数据对象。
来自日志文件的示例呼叫数据记录(这些是Windows创建的平面ACSII文件):
awk
答案 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"字符串,然后从第五和第六项中删除所有标点符号,即日期和时间。然后输出到您的新文件名
是一个简单的例子