使用Linux Shell处理CSV网络状态日志,去除连续重复状态
处理连续重复状态的Shell脚本方案
先看看你的原始日志内容:
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
要去除连续重复的状态值(只保留状态切换的第一行),用awk是最直接高效的方案,因为它能轻松按列处理CSV数据:
awk -F ',' '$3 != prev {print; prev=$3}' log.csv
命令解释:
-F ',':告诉awk用逗号作为列分隔符,这样$3就对应第三列的状态值(OK/ERROR)$3 != prev:只当当前行的状态和上一行记录的状态不一样时,才执行后续动作print:输出当前行(也就是状态切换的起始行)prev=$3:更新prev变量为当前行的状态,供下一行对比使用
执行后你会得到精简后的日志:
2018-04-27,23:37,OK 2018-04-27,23:40,ERROR 2018-04-27,23:42,OK
如果需要把结果保存到新文件,直接重定向输出即可:
awk -F ',' '$3 != prev {print; prev=$3}' log.csv > cleaned_log.csv
补充说明:
有人可能会想到用uniq,但uniq默认是整行去重,而我们只需要基于第三列去重连续项。如果非要用uniq,得先对第三列做处理,但这样会打乱原始日志的时间顺序(因为需要先排序),所以awk方案是最优选择,它能完美保留日志的时间顺序,只处理连续重复的状态。
内容的提问来源于stack exchange,提问作者Sopalajo de Arrierez
相关产品推荐
相关产品推荐

