extrai parte do texto de todas as linhas correspondentes

1

Estou executando um loop for no conjunto de servidores para encontrar a expiração da cert. A saída do comando cert será abaixo para cada servidor:

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

O objetivo é extrair apenas parte da data depois de Para:

Consegui fazer isso funcionar com o seguinte comando

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

Mas o problema é que está imprimindo apenas a última ocorrência ignorando todas as ocorrências de "Válido"

Aqui está o loop for que estou executando

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

o arquivo de saída é impresso somente a partir do último servidor no arquivo server.text.

A ideia era ter um arquivo com o nome do host, o nome do qmgr e a data de validade do cert, classificá-lo por data e, em seguida, executar uma ação.

    
por MO12 30.09.2015 / 18:54

2 respostas

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
    
por 30.09.2015 / 20:23
0

Em vez de sed , você provavelmente faria algo semelhante em 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

Que como um forro seria:

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");'

Que deve extrair a data desejada e convertê-la em um formato classificável. (ou você pode usar epoch , claro.

    
por 30.09.2015 / 20:22

Tags