Eu tenho uma variável como
master='172.21.154.37 172.21.250.94 172.21.251.93 172.21.250.94' e preciso verificar se a primeira e a segunda coluna no arquivo correspondem à variável. O seguinte é um exemplo, a segunda linha, 172.21.154.37 pode ser encontrada nas variáveis $master e 172.21.250.94 também pode ser encontrada em $master
172.21.154.40 172.21.254.25
172.21.154.37 172.21.250.94
172.21.250.93 172.21.254.24
awk '$1 /'$master'/ {print $0 }' /tmp/newip.txt but there is an escapte issue
awk '$1 /172.21.154.37' 172.21.250.94 172.21.251.93 '172.21.250.94/ {imprimir $0 }' /tmp/nehip.txt
problema resolvido,obrigado
Sua sintaxe na correspondência é falha, independentemente do problema de escape.
awk '$1 /172.21.154.37'
sempre será verdadeiro se o campo 1 não estiver vazio: você precisa de um operador como~
, ou uma função comoindex()
. Em qualquer caso, corresponder texto contendo o caractere especial.
não é sensato.index()
é uma pesquisa de texto simples.O método correto para injetar variáveis de shell em
awk
scripts é passar o valor usando a opção -v.Dividir uma lista de IPs em um array awk e usar o
in
operador geralmente é mais limpo do que pesquisas de padrões. Seu teste duplo seria então como:($1 in List) && ($2 in List)
.Veja como-usar-variáveis-de-shell-em-um-script-awk para saber como passar o valor de uma variável de shell para um script awk.
Como @Paul_Pedant menciona em sua resposta , criar um array awk (
targets[]
abaixo) a partir da suamaster
variável shell e então usá-loin
para fazer uma pesquisa de hash de cada endereço IP é a maneira mais eficiente e robusta de fazer isso, por exemplo, usando qualquer awk: