일치하는 모든 줄에서 부분 텍스트 추출

일치하는 모든 줄에서 부분 텍스트 추출

인증서 만료 시간을 찾기 위해 서버 집합에서 for 루프를 실행하고 있습니다. 각 서버에 대한 cert 명령 출력은 다음과 같습니다.

line 1
line 2
line 3
Valid From: Tuesday, 29 September 2015 10:40:13 AM To: Friday, 28 September 2018 10:40:13 AM
line 5

목표는 To 다음의 날짜 부분만 추출하는 것입니다.

다음 명령을 사용하여 작동하게 할 수있었습니다

sed -n -e '/Valid/ s/.*\, *//p' |awk '{print $1 " " $2 " " $3 }')"

그러나 문제는 "Valid"의 모든 항목을 무시하고 마지막 항목만 인쇄한다는 것입니다.

이것은 내가 실행 중인 for 루프입니다.

for host in `cat /home/MO/server.txt`
do
for qmgr in $(ssh musr@$host dspmq)
do
certexp="$(ssh musr@$host <cert command> <path to cert> |sed -n -e '/Valid/ s/.*\, *//p' |awk '{print $1 " " $2 " " $3 }')"
echo "$host     :       $qmgr      :       $certexp" > out.txt
done
done

출력 파일은 server.text 파일의 마지막 서버에서만 인쇄됩니다.

아이디어는 호스트 이름, qmgr 이름 및 인증서 만료 날짜가 포함된 파일을 갖고 날짜별로 정렬한 다음 조치를 취하는 것입니다.

답변1

while read -r host
do
    for qmgr in $(ssh musr@$host dspmq)
    do
        ssh musr@$host <cert command> <path to cert> |
        sed -n "s/ *..:[^,]*$//;/Valid/s/.*\, */$host\t:\t$qmgr\t:\t/p"
    done
done < "/home/MO/server.txt" > out.txt

답변2

대신 sed다음과 같이 할 수 있습니다 perl.

#!/usr/bin/env perl

use strict;
use warnings;

use Time::Piece;

local $/;
my ( $to ) = <DATA> =~ m/To: (.*)$/gm;
#print $to;
# print localtime->strftime("%A, %d %B %Y %H:%M:%S %p");
my $timestamp = Time::Piece -> strptime($to, "%A, %d %B %Y %H:%M:%S %p");
print $timestamp -> epoch, " => ", $timestamp -> strftime("%Y-%m-%d %H:%M:%S");

__DATA__
line 1
line 2
line 3
Valid From: Tuesday, 29 September 2015 10:40:13 AM To: Friday, 28 September 2018 10:40:13 AM
line 5

라이너로는 다음과 같습니다.

perl -0777 -e 'print Time::Piece -> strptime(<>=~m/To: (.*)$/gm, "%A, %d %B %Y %H:%M:%S %p") -> strftime("%Y-%m-%d %H:%M:%S");'

필요한 날짜를 추출하여 정렬 가능한 형식으로 변환해야 합니다. (또는 epoch물론 .

관련 정보