【问题标题】:How parse line of NAT log and make a specific CSV output如何解析 NAT 日志行并生成特定的 CSV 输出
【发布时间】:2017-04-28 17:28:15
【问题描述】:

我有一个 NAT 设备,它会生成这样的 NAT 日志:

Dec 13 18:12:59 172.16.1.1 "LSN_DELETE""192.168.100.1%101:11921""TCP""100.100.100.100%101:11921""104.111.224.226:80""1481639868477""327573"

我想通过将此文件的每一行转换为:

192.168.100.1,11921,TCP,100.100.100.100,11921,104.111.224.226,80,1481639868477,327573

我知道我可以逐行读取文件并使用 cut 命令进行转换,但是逐行读取文件非常慢而且文件非常大(500 万行)。我想通过更快的 awk 或 sed 转换它。有人可以帮我做吗?

【问题讨论】:

  • 您自己尝试过吗?您应该显示您的代码的特定问题。否则,问题看起来像一个作业。
  • 除非您想要一个仅适用于特定输入行的解决方案,否则还要发布几行简明、可测试的示例输入和预期输出,可用于证明给定脚本满足您的所有要求要求。见How to Ask

标签: parsing awk sed cut


【解决方案1】:

在 awk 中,部分解决方案(您必须按照自己喜欢的顺序添加字段):

gawk -F '[^.[:digit:][:alpha:]]*' -v OFS=, '{print $9,$15,$12}' file

即假设日志在名为file的文件中:

  • 它使用字段分隔符 (-F) 将每一行分开,其中 假设(根据您的数据,这可能不是 100%) 字段中包含任意数量的连续句点、数字和字母字符。
  • 输出字段分隔符 (OFS) 设置为逗号
  • 打印选择的字段并重新排列。

不保证这会比你以前做的更快。

【讨论】:

  • 该脚本没有什么 gawk 特有的。
  • 它工作正常。还有一个问题。我尝试在 18 美元和 19 美元上打印数学并打印输出,但它会打印指数输出,例如 '{print (($18+$19)/1000) }' => 1.48166e+12。我应该如何打印它是圆形和非指数的?喜欢这个 1481661496
  • 我找到了答案:{print int(($18+$19)/1000)}。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 2012-05-12
  • 2011-12-23
相关资源
最近更新 更多