ログファイルから最近の日付を削除し、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)。しかし、その道はかなり面倒で険しい道だ。このファイルから必要な日付を抽出するには、よりエレガントな解決策が必要だと思います。ちなみに、日付はgrepd / tail"dテキスト(ファイルの最後または最後のエントリ)を含む行の最初の10文字で構成されています。よりエレガントなソリューションの提案がありますか?

ちなみに、この行は、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文字の場合は、2番目のgrepの代わりにcutを使用できます。

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"

関連情報