인증서 만료 시간을 찾기 위해 서버 집합에서 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
물론 .