로그 파일에서 최근 날짜를 제거하고 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자로 구성됩니다. 보다 우아한 솔루션에 대한 제안이 있으십니까?

그런데 이 줄은 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자이면 두 번째 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"

관련 정보