Ok, vamos fazer isso passo a passo:
sed -n '
A opção -n
torna sed
output nada, a menos que seja dito
/Policy Name:/! d
Todas as linhas que não contêm Policy name:
são excluídas. O restante do script é processado somente nos loops a seguir.
s/.*:\s\+//
h
Isso remove tudo até o :
e os espaços à direita e coloca o restante no buffer de suspensão para uso posterior.
:1
n
Este é o começo de um loop lendo novas linhas
/Active:\s*no/d
Linhas com esse padrão são removidas, então obviamente não há interesse em inativos
/HW\//!b1
E agora, fazemos um loop para :1
se a linha não contiver HW/
:2
s/.*\s\(\S*\)\s*//
Começando o próximo loop, remova tudo, exceto a última seqüência de não-brancos.
G
s/\n/\t/p
Em seguida, anexe o nome da política mantido no buffer de retenção, separado por uma guia e imprima essa linha
n
/^\s*$\|Include:/! b2
'
e isso se repete com as próximas linhas até atingirmos o padrão fornecido.
Você deve observar que esse é um código altamente não portátil que não funciona em muitas sed
versões.
Editar: Para adicionar o tipo de política como uma terceira coluna, você deve adicionar essa linha ao script antes ou depois do Active:
check:
/Policy Type:/{s/.*:\s*//;H;}
Ou seja: se a linha contiver a cadeia, execute os comandos entre {}
. Esses comandos removem a parte até :
e espaços em branco finais e anexam o restante da linha (que deve conter o tipo de política) ao buffer de armazenamento. Assim, o buffer de espera contém nome e tipo de política, separados por uma nova linha. Portanto, quando acrescentarmos isso com G
, haverá duas novas linhas a serem substituídas, então o comando de substituição precisa obter o sinalizador g
para substituir todas as ocorrências:
s/\n/\t/gp
O script do AIX é basicamente o mesmo, mas evita extensões do GNU para expressões regulares. Principalmente as variáveis de uso para corresponder aos espaços ou guias brancas, pois \t
não funcionará em todos os sed
flavors, assim como +
para "um ou mais" precisa ser substituído por \{1,\}