Eu tenho um arquivo grande com muitas informações desnecessárias. Estou interessado apenas na seção entre editar e próximo e tratá-los como uma entrada. Eu consigo filtrar assim....
'
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/) { print $0"\n"}}' > outputfile
Amostra do arquivo de saída mostrado abaixo.
edit 114
set uuid 6cb43
set action accept
set srcintf "Port-ch40.1657"
set dstintf "any"
set srcaddr "1.1.1.1"
set dstaddr "all"
set schedule "always"
set service "ALL_ICMP" "icmp-echo-reply" "icmp-source-quench" "icmp-time-exceeded" "icmp-unreachable"
set logtraffic all
next
edit 330
set uuid 6d3d
set action accept
set srcintf "Po40.28"
set dstintf "any"
set srcaddr "all"
set dstaddr "2.2.2.2"
set schedule "always"
set service "ALL_ICMP" "icmp-echo-reply" "icmp-source-quench" "icmp-time-exceeded" "icmp-unreachable"
set logtraffic all
next
existe uma opção com grep onde os valores podem vir de um arquivo (grep -f filterfile textfile). Vamos supor que filterfile contenha os valores ...
1.1.1.1
3.3.3.3
Na realidade, seria muito mais que a entrada manual poderia não estar funcionando.
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/ &&(/1.1.1.1/||/3.3.3.3/)) { print $0"\n"}}' > outputfile
O comando awk pode ser modificado para lidar com valores provenientes de um arquivo?
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/ &&(values_from_filterfile)) { print $0"\n"}}' > outputfile
se for seu:
é realmente o que você precisa fazer, você pode combinar coisas de um arquivo "match.list" contendo em cada linha algum endereço IP com:
FWIW, eu não usaria regexps para isso, eu criaria um array (
v[]
) abaixo que mapeia tags comosrcaddr
seus valores como"1.1.1.1"
ou"all"
e então você pode fazer uma pesquisa de hash dos índices do array para descobrir quais tags estão presentes no bloco atual e quais valores as tags de seu interesse possuem. Por exemplo, usando qualquer awk POSIX:Com essa estrutura, você pode testar ou alterar trivialmente quaisquer valores de quaisquer tags que desejar e escrever testes muito mais precisos para o que você deseja que seja o conteúdo de cada tag em cada bloco, em vez de apenas fazer uma comparação de regexp em todo o bloco. Por exemplo, se você quiser encontrar/exibir os blocos onde
uuid
is6cb43
,schedule
isalways
eservice
include"icmp-time-exceeded"
você pode simplesmente alterar isto:para isso:
e se você quiser definir qualquer tag com algum outro valor antes de imprimir, basta preenchê-lo
v[]
antes do loop de impressão:Para responder apenas ao ponto específico, o awk pode manipular valores provenientes de um arquivo , sim, você pode redirecionar a entrada para um
getline
comando usando<
o nome do arquivo. Adicione ao final do seu bloco BEGIN:Como você já configurou FS e RS,
getline
irá ler o arquivo inteiro$0
, então basta substituir os separadores de linha pelo|
operador regexp. Use a variável resultante commatch
: