为了在日志文件中查找日期,我得到了以下粗略命令:
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"