如何将值与先前的对象进行比较?

时间:2019-11-28 21:38:34

标签: json jq

我正在使用jq以一种可读的方式格式化journalctl -o json中的日志条目。虽然效果很好,但我缺少重新启动的journalctl指示器。此信息未直接包含在json格式输出中。但是可以通过将当前对象的_BOOT_ID值与上一行的值进行比较来推断。如果它们不同,则该消息属于另一个引导会话,我需要插入“-Reboot-”这一行。

如何在jq中比较该值?

以下是我正在做的事情的简单版本:

journalctl -o json --since today |jq -r '
  "\(._SOURCE_REALTIME_TIMESTAMP // .__REALTIME_TIMESTAMP |tonumber |. / 1000000 |strflocaltime("%m-%d %H:%M:%S")) \(.SYSLOG_IDENTIFIER // .UNIT): \(.MESSAGE)"
' |less

它显示时间戳,单位名称和消息。我正在寻找的东西类似以下内容(其中$$previous$$不存在):

journalctl -o json --since today |jq -r '
  "\(if ._BOOT_ID != $$previous$$._BOOT_ID then "-- Reboot --\n" else "" end)\(._SOURCE_REALTIME_TIMESTAMP // .__REALTIME_TIMESTAMP |tonumber |. / 1000000 |strflocaltime("%m-%d %H:%M:%S")) \(.SYSLOG_IDENTIFIER // .UNIT): \(.MESSAGE)"
' |less

我也接受在一行的末尾设置变量,并在下一行的开始访问它们;但是变量似乎不存在,我只能设置当前对象的属性,这无济于事。

1 个答案:

答案 0 :(得分:1)

可以使用ID <- c("i_1", "i_2", "i_3", "i_4") t_1 <- c("A","C","A","C") t_2 <- c("C","A","C","L") t_3 <- c("L","C","L","L") t_4 <- c("C","L","L","L") path <-data.frame("ID" = ID, "t_1" = t_1, "t_2"=t_2, "t_3" = t_3, "t_4" = t_4) path diff_path_01 <- path[path$t_1 =="A" & path$t_2 == "C" &path$t_3 == "L",] diff_path_01 diff_path_02 <- path[path$t_1 =="A" & path$t_2 == "C" &path$t_3 == "C" & path$t_4 == "L",] diff_path_02 diff_path_03 <- path[path$t_2 =="A" & path$t_3 == "C" &path$t_4 == "L",] diff_path_03 row(diff_path_03) count <- nrow(diff_path_01)+nrow(diff_path_02) +nrow(diff_path_03) count 沿以下行获得解决方案:

foreach

您将用定义感兴趣投影的过滤器替换jq -nr ' foreach inputs as $entry (null; $entry + if (. != null) and (._BOOT_ID != $entry._BOOT_ID) then {emit: true} else null end; if .emit then "-- Reboot --" else empty end, .foo) '