从日志文件中删除最近的日期,输出为 motd

从日志文件中删除最近的日期,输出为 motd

为了在日志文件中查找日期,我得到了以下粗略命令:

grep Updated /var/log/socklog/xbps/current | tail -n 1 | grep -Eo ^20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]

这就是我所需要的,即输出我在 Void 机器上执行的上次系统升级的日期:例如 2019-01-24。但这是一条相当麻烦而且也很粗糙的线路。我认为必须有一个更优雅的解决方案来从该文件中提取所需的日期。顺便说一句,日期由包含文本grep“d/ tail”d(文件中最后一次或最近一次出现)的行的前 10 个字符组成。对于更优雅的解决方案有什么建议吗?

顺便说一句,这条线被用来生成 a,motd这样当我登录系统时,我会看到类似“上次系统升级 2019-01-24”之类的内容。因此,我创建了一个/etc/motd.sh包含该行的脚本,然后从 /etc/profile 调用该脚本。我是否要以正确的方式让信息可见?做我想做的事还有什么其他选择?

该脚本/etc/motd.sh如下所示:

#!/bin/bash
echo last system upgrade $(grep Updated /var/log/socklog/xbps/current | tail -n 1 | grep -Eo ^20[0-9][0-9]-[0-9][0-9]-[0-9][0-9])

PS 这是根据要求从日志文件中提取的示例行:

2019-01-15T18:05:51.31699 user.notice: Jan 15 12:05:51 xbps-install: Installed `brotli-1.0.7_1' successfully (rootdir: /).
2019-01-15T18:05:51.35465 user.notice: Jan 15 12:05:51 xbps-install: Updated `xwininfo-1.1.4_2' successfully (rootdir: /).

答案1

如果日期是前 10 个字符,则可以使用 cut 代替第二个 grep

tail -n 1 | cut -c1-10

答案2

我可能会用awk.在日期戳中拆分字段T,查找Updated并打印最后一次出现的位置。

awk -FT '/Updated/ {date=$1} END {print date}' /var/log/socklog/xbps/current

您可以直接对其进行插值,或者采用更具可读性的方法

#!/bin/bash
#
updated=$(awk -FT '/Updated/ {date=$1} END {print date}' /var/log/socklog/xbps/current)
[[ -n "$updated" ]] && printf "Last system upgrade %s\n" "$updated"

相关内容