【问题标题】:Linux shell: Detecting state changes on a CSV log fileLinux shell:检测 CSV 日志文件的状态变化
【发布时间】:2018-10-08 19:32:25
【问题描述】:

这是我自动生成的日志文件(连续一分钟检查我的互联网线路):

$ cat log.csv

2018-04-27,23:37,OK
2018-04-27,23:38,OK
2018-04-27,23:39,OK
2018-04-27,23:40,ERROR
2018-04-27,23:41,ERROR
2018-04-27,23:42,OK
2018-04-27,23:43,OK
2018-04-27,23:44,OK
2018-04-27,23:45,OK

我试图通过编写一些依赖于第三个字段(行状态:OK/ERROR)状态和删除连续值的解释方法的脚本,某种shell脚本,使它更便于阅读仅显示互联网线路的初始和状态变化,将上述日志转换为:

2018-04-27,23:37,OK
2018-04-27,23:40,ERROR
2018-04-27,23:42,OK

这意味着:

2018-04-27,23:37,Entered Status OK
2018-04-27,23:40,Entered Status ERROR
2018-04-27,23:42,Entered Status OK

可以看出,只保留状态更改会使日志的显示更短且更容易阅读。

假设日志文件可能很长(考虑几个月的一分钟日志记录),在 Linux shell 上编写此“解释”脚本可能是一种适当(有效)的方法?

我知道 considered 在 shell 上迭代不是一个非常好的主意,所以我在考虑 AWK,但我对它不是很有经验。
当然,循环解决方案总比没有好。

更多数据

  • 一个类似(但不一样)的问题(我也问过)here

【问题讨论】:

    标签: csv logging


    【解决方案1】:

    AWK 方法:

    awk -F "," '$3==last{next} {last=$3} {print $0}' log.csv
    

    输出:

    2018-04-27,23:37,OK
    2018-04-27,23:40,ERROR
    2018-04-27,23:42,OK
    

    工作原理

    • -F "," 用逗号作为字段分隔符。
    • $3==last{next} 忽略第三个字段等于 lastvariable 的任何行:命令 next 告诉 awk 跳过所有剩余的命令并从下一行重新开始。
    • last=$3 将第三个字段(OK/ERROR)保存在变量 last 中。
    • {print $0} 表示打印当前行。

    对于任何特殊情况都不是完美的解决方案,即:如果第三个字段为空。但这对我来说已经足够了。

    感谢 John1024 对此thread

    【讨论】:

      【解决方案2】:

      选项1。当日志行开头的长度相同或字段之间的分隔符是空格或制表符时,Bash uniq 命令就足够了。

      uniq -s 17 log.csv
      

      uniq 过滤掉相邻的匹配行,而-s 17 标志使其忽略构成时间戳的每一行的前 17 个字符。

      uniq -f 2 log.csv
      

      -f 2 使uniq 忽略前两个字段。不幸的是,无法将默认分隔符从空格更改为其他内容。

      选项 2。 truniq 适用于可以轻松切换分隔符的简单情况。

      # tab is inserted with CTRL+V followed by TAB
      tr ',' '    ' < log.csv | uniq -f 2
      

      tr 是 translate 的缩写,它将所有出现的第一个参数转换为第二个参数(在这种情况下从 , 到制表符)。 tr 使用流作为输入。

      选项 3。seduniq 将适用于日志内容可能包含分隔符本身的更复杂的情况。

      sed 's/,/\t/;s/,/\t/' log.csv | uniq -f 2
      

      sed 是流编辑器的缩写,它将用制表符替换前两次出现的逗号(sed 允许使用 \t)。 sed 's/,/\t/' log.csv 将仅替换第一次出现,因此通过添加相同的搜索和替换模式两次重复相同的搜索并用分号分隔。

      阅读更多关于 uniq 的使用:

      man uniq
      uniq --help
      

      【讨论】:

      • 我不知道uniq 的这种能力。顺便说一下,提议的案例示例是一个简化的示例,因此17 偏移量可能会发生变化(即:对于 CSV 文件上的非固定宽度字段),这将需要更多的解析/编程。尽管如此,这是一个很好的可能性,因为据我所知,uniq 命令是一种快速(对大文件有效)工具。谢谢你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2015-12-28
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多