Seus dados são altamente estruturados como key="value" , para que você possa
escreva um script de shell pequeno usando o gnu awk, que toma como argumento uma lista de nomes de chaves e apenas imprime esses valores. Por exemplo, myscript
:
#!/bin/bash
awk -v lhs="$*" '
BEGIN{ FPAT = "[a-z-]*=\"[^\"]*\""
nwant = split(lhs,want)
}
{ for(i=1;i<=NF;i++){
start = match($i,/([a-z-]*)="([^"]*)"/,a)
key[a[1]] = a[2]
}
for(i=1;i<=nwant;i++){printf "%s ",key[want[i]]; key[want[i]] = ""}
printf "\n"
}'
que você chama de myscript srcip categoryname url
.
Isso define a variável awk lhs
para os argumentos como uma única string, que são divididos em array want
no início. As linhas são divididas por awk em campos que correspondem ao padrão key="value" usando a variável incorporada FPAT
.
Em cada linha, dividimos cada campo com match()
em 2 grupos capturados, para a chave e para a parte entre aspas duplas. Estes são colocados pelo awk no array a
, e nós os salvamos em um array associativo key
indexado pela string de chave.
Em seguida, para cada chave desejada, imprimimos o valor e o desmarcamos para a próxima linha (caso essa linha não tenha essa chave). Obviamente, isso pressupõe que todos os dados tenham a estrutura necessária e precisarão de alterações para manipular (") dentro do valor ou chaves com caracteres não-alfabéticos.
Versões do gnu awk (gawk) anteriores a 4.0 não possuem o FPAT
embutido para dividir a linha em campos que correspondem a um padrão, então você precisa fazer isso sozinho:
#!/bin/bash
awk -v lhs="$*" '
BEGIN{ nwant = split(lhs,want) }
{ input = $0
while(match(input,"[a-z-]*=\"[^\"]*\"")>0){
field = substr(input,RSTART,RLENGTH)
input = substr(input,RSTART+RLENGTH)
start = match(field,/([a-z-]*)="([^"]*)"/,a)
key[a[1]] = a[2]
}
for(i=1;i<=nwant;i++){printf "%s ",key[want[i]]; key[want[i]] = ""}
printf "\n"
}'
Obviamente, você pode combinar as duas chamadas de correspondência em uma, mas isso mostra a diferença com a original.