awk ou sed para exibir a saída um por linha com base no padrão de pesquisa

1

Eu tenho o seguinte arquivo: procurar por "LC" (segundo padrão de pesquisa) dá mais que uma saída de linha, eu preciso processá-lo para fornecer um por linha repetindo o primeiro padrão de pesquisa adjacente a ele.

Schedule Name:       Today

  Schedule Type:       Standard
  Active:              yes
  Effective date:      01/24/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  EU         NY  Cindy
                 BU         CA  Victor
                 GU         MI  Bob
  Include:
Schedule Name:       Tomorrow

  Schedule Type:       Standard
  Active:              yes
  Effective date:      01/26/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  MU         LA  Martha
                 EU         CA  Sam
  Include:
Schedule Name:       Yesterday

  Schedule Type:       Standard
  Active:              no
  Effective date:      01/21/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  NV         IL  Joe

  Include:

Saída desejada

Cindy    Today
Victor   Today
Bob      Today
Martha   Tomorrow
Sam      Tomorrow

Agora, quero receber Schedule Name , ou seja, hoje, amanhã, junto com Customer name , que é o quarto campo se Active for yes . Então a saída deve ser:

cat billing | 
    awk '/Schedule Name/ || /Active:/ || /Loc/,/^$/' | 
    grep -v '^$'

Uma linha em branco é depois de Loc antes de Incluir, Então eu estou tentando obter todos os dados até encontrar uma linha em branco e depois grep -v linha em branco, Ele funciona bem se eu tentar sem despertar Nome agendado e ativo, mas não • trabalhe junto com essas duas pesquisas de patter.

Estou usando o código abaixo, que é bem lento.

for pol in 'cat /tmp/Active_Policies'
do
        count='sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | wc -l'
        if [ $count -gt 0 ]
        then
                first='sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | awk '{print $4}' | head -1'
                echo "$first    $pol" >> /tmp/Clients_Policies_$(date +%m-%d-%Y)
                counter=1
                for client in 'sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | awk '{print $3}' | sed '1d;$d''
                do
                        ((counter = counter + 1))
                        if [ $counter -le $count ]
                        then
                                echo "$client   $pol" >> /tmp/Clients_Policies_$(date +%m-%d-%Y)
                        fi
                done
        fi
done
    
por Sid 17.02.2017 / 14:10

2 respostas

2

Tente isso

awk '
    BEGIN{OFS = "\t"}
    /Schedule Name:/{s = $NF}
    /Active:/{a = $2}
    /:|^$/&&!/LC\//{next}
    a == "yes"{print $NF, s}
    ' file

Ou sed

sed '
    /Schedule Name:/! d
    s/.*:\s\+//
    :1
    N
    /Active:/! b1
    /yes/! d
    :2
    $! N
    /Include:/d
    /LC\//!{/:\|^$/b2;}
    s/\s*\n.*\s\(\S\+\)\s*/\n/
    s/\(.*\)\n\(.*\)/\t/p
    s/.*\t//
    t2
    ' file

sed versão 2:

sed -n '
    /Schedule Name:/! d
    s/.*:\s\+//
    h
    :1
    n
    /Active:\s*no/d
    /LC\//!b1
    :2
    s/.*\s\(\S*\)\s*//
    G
    s/\n/\t/p
    n
    /^\s*$\|Include:/! b2
    ' file
    
por 17.02.2017 / 14:59
-1
awk '/Schedule/{A="";S=$NF;next}/Active/{A=$NF;next}/Customer/&&A=="yes"{print $NF,S}' billing
    
por 20.02.2017 / 08:33