从所有匹配行中提取部分文本

从所有匹配行中提取部分文本

我正在对一组服务器运行 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当然可以使用。

相关内容