【问题标题】:Remove lines having older end time删除结束时间较早的行
【发布时间】:2018-03-11 09:24:47
【问题描述】:

在我的 bash 脚本中,我想添加一个代码来删除所有早于 x 天的条目。

  1. 为了简化这个问题,我分为三个部分。 2部分是 完成寻找第三部分的答案。) a) 查找最新的日志日期 - 完成 b) 评估最早的纪元时间。 (此纪元之前的所有条目 时间应该被删除) - 完成

No_OF_DAYS=2

One_Day=86400000

Latest_Time=`find . -name '*.tps' -exec sed '/endTime/!d; s/{//; s/,.*//' {} + | sort -r | head -1 | cut -d: -f2`  #latest epoch time
Days_in_Epoch=$(($One_Day * $No_OF_DAYS))
Earliest_Time=$((Latest_Time - $Days_in_Epoch)) #earliest epoch time

c) 删除所有早于评估最早时间的日志条目。

PS:

  1. 有多个文件,分布在不同的子文件夹中。
  2. 所有扩展名为".tps"的文件。
  3. 时间采用纪元格式。将考虑 endTime 进行计算。("endTime":1488902735220)
  4. 样本数据

代码:

{"endTime":1488902734775,"startTime":1488902734775,"operationIdentity":"publishCacheStatistics","name":"murex.risk.control.excesses.cache.CacheStatisticsTracer","context":{"parentContext":{"id":-1,"parentContext":null},"data":[{"value":"excessCacheExcessKeysToContexts","key":"name"},{"value":"0","key":"hits"},{"value":"0","key":"misses"},{"value":"0","key":"count"},{"value":"0","key":"maxElements"},{"value":"0","key":"evictions"},{"value":"N/A","key":"policy"}],"id":0}}
{"endTime":1488902735220,"startTime":1488902735220,"operationIdentity":"publishCacheStatistics","name":"murex.risk.control.excesses.cache.CacheStatisticsTracer","context":{"parentContext":{"id":-1,"parentContext":null},"data":[{"value":"excessCacheExcessKeysToContexts","key":"name"},{"value":"0","key":"hits"},{"value":"0","key":"misses"},{"value":"0","key":"count"},{"value":"0","key":"maxElements"},{"value":"0","key":"evictions"},{"value":"N/A","key":"policy"}],"id":8}}
{"endTime":1488902735550,"startTime":1488902735550,"operationIdentity":"publishCacheStatistics","name":"murex.risk.control.excesses.cache.CacheStatisticsTracer","context":{"parentContext":{"id":-1,"parentContext":null},"data":[{"value":"excessCacheContextsToExcessIds","key":"name"},{"value":"0","key":"hits"},{"value":"0","key":"misses"},{"value":"0","key":"count"},{"value":"0","key":"maxElements"},{"value":"0","key":"evictions"},{"value":"N/A","key":"policy"}],"id":9}}

例如:

一)

最新纪元时间 = 1488902735550

b)

最早的纪元时间 = 1488902735220

问题:现在我正在寻找删除所有比最早纪元时间更早/更少的条目的命令。在上面的例子中,第一行应该被删除。

感谢任何帮助/建议。谢谢Linux

【问题讨论】:

  • 请注意,您正在处理的数据是 JSON,它可能有助于解析它而不是使用文本操作工具。 jq 是一个从 bash 解析 JSON 的便捷工具
  • 嘿,我在他最后一个问题上告诉他了。
  • @ankit,您需要使用 awk 或 perl 或 python 之类的语言,您可以在其中根据算术条件过滤行。 sed 不是为此而构建的。
  • 感谢大家的回复。我并不是专门查看 sed 命令。我想我可以在 bash 脚本中使用 awk。问题是我不能使用其他工具,因为这是我的 bash 脚本的一小部分。所以没有其他方法可以在 bash 脚本中实现它??
  • 使用文本处理工具的主要问题是,一旦数据格式发生变化,您的解决方案可能会中断。第二个问题是,在同等知识水平下,使用 JSON 解析器的人将比使用文本处理工具的人更有效率。当然你得先学会使用 JSON 工具,但真正上手几乎不需要超过 30 分钟

标签: bash


【解决方案1】:

这可以解决问题,伙计。小心先用备份文件测试它,因为它会直接覆盖你的日志。还可以更改您想要比较的任何时间变量。

while read file 
do

    awk -v FS=':|,' -v TIME='1488902735220' '{ if (! ($2 > TIME) && !( $0 ~ /^ *$/ ) )  { print $0 }   }'  $file > tmp.txt && cat tmp.txt > $file


done < <( find ./ -name '*.tps' 2>/dev/null )

问候!

【讨论】:

    【解决方案2】:

    根据您当前的解决方案,我将使用一个简单的循环逐行读取文件,并仅输出 endTime 大于您最早时间的那些:

    while read line; do
        line_endTime=$(awk -F '[:,]' '{print $2}' <<< $line)
        if [ "$line_endTime" -le "$Earliest_Time" ]; then echo $line; fi
    done < input_file > filtered_output_file
    

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 2014-02-07
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多