Eu tenho um comando de trabalho
awk -F '[)#/(:]' 'BEGIN { fw="";dev=""} {if ($0~/sh failover/) fw=$1 ; if (($0~/This host/)||($0~/Other host/)) dev=$2; if ($0~/\)\:/) {print $2,$1,fw, dev} }' OFS="|" test_data
Eu gostaria de transformá-lo em um script. Ao fazer isso...
#!/bin/sh
awk '
BEGIN {F='[)#/(:]'; FS = "\n"; RS = ""; OFS = "|";fw="";dev=""}
{
if ($0~/sh failover/) fw=$1 ;
if (($0~/This host/)||($0~/Other host/)) dev=$2;
if ($0~/\)\:/) {
print $2,$1,fw, dev
}
}' test_data
...o F='[)#/(:]' resulta em um erro.
[...srv01]$ ./test
./test: line 3: syntax error near unexpected token `)'
./test: line 3: `BEGIN {F='[)#/(:]'; FS = "\n"; RS = ""; OFS = "|";fw="";dev=""} '
[...srv01]$
Ao mudar para aspas duplas, leva tudo entre as aspas duplas twp como separador, portanto, procurará )#/(: em vez de ) ou # ou / ou ( ou :
Aqui está o conteúdo do arquivo test_data
[...srv01]$ cat test_data
JoeASA# sh failover | i \)\:|host
This host: Primary - Active
admin Interface management (313.13.0.13): Normal (Monitored)
DMZ-FW Interface Inside (310.13.19.7): Normal (Not-Monitored)
DMZ-FW Interface Outside-Zone2 (912.168.119.7): Normal (Not-Monitored)
ENET Interface OUTSIDE(912.168.191.7): Normal (Not-Monitored)
ENET Interface dmarc (912.168.192.7): Normal (Not-Monitored)
GW Interface Extranet (912.168.23.27): Normal (Not-Monitored)
GW Interface Outside-Zone (912.168.123.27): Normal (Not-Monitored)
GW Interface management (331.1.1.47): Normal (Not-Monitored)
Other host: Secondary - Standby Ready
admin Interface management (313.13.0.12): Normal (Monitored)
DMZ-FW Interface Inside (310.13.19.6): Normal (Not-Monitored)
DMZ-FW Interface Outside-Zone2 (912.168.119.6): Normal (Not-Monitored)
ENET Interface OUTSIDE(912.168.191.6): Normal (Not-Monitored)
ENET Interface dmarc (912.168.192.6): Normal (Not-Monitored)
GW Interface Extranet (912.168.23.26): Normal (Not-Monitored)
GW Interface Outside-Zone (912.168.123.26): Normal (Not-Monitored)
GW Interface management (331.1.1.46): Normal (Not-Monitored)
SIMPLEASA1/sec/act# sh failover | i \)\:|host
This host: Secondary - Active
Interface Edge (912.168.22.17): Normal (Monitored)
Interface Inside (310.13.19.17): Normal (Monitored)
Interface EXT (912.168.50.17): Normal (Monitored)
Interface WIFI (912.168.11.17): Normal (Monitored)
Other host: Primary - Standby Ready
Interface Edge (912.168.22.16): Normal (Monitored)
Interface Inside (310.13.19.16): Normal (Monitored)
Interface EXT (912.168.50.16): Normal (Monitored)
Interface WIFI (912.168.11.16): Normal (Monitored)
[..srv01]$
Você está passando o script para o awk como uma string com aspas simples do shell, mas parece ter aspas simples dentro do script também. Na verdade, eles terminam a string entre aspas:
O shell vê um unquoted
)
, o que causa um erro de sintaxe. Não que você queira usar aspas simples no script awk de qualquer maneira, elas seriam um erro de sintaxe em awk . Portanto, use aspas duplas, como você fez para as outras atribuições, elas se encaixam perfeitamente dentro de aspas simples no shell e, na verdade, funcionam em código awk:Em seguida, observe que o que a
-F
opção awk faz é definir o separador de campo, que é a variávelFS
, nãoF
. Então, você quer terBEGIN { FS="[)#/(:]"; ...
, e provavelmente também não quer alterar o separador de registro padrãoRS
- pelo menos você não o alterou em sua linha acima.Além disso, em vez de colocar um script awk dentro de um script de shell, você pode simplesmente pular o shell e tornar o awk o interpretador desse script diretamente (supondo que seu awk esteja em
/usr/bin/awk
):Se isso for chamado
./script.awk
e tornado executável, você pode executá-lo como./script.awk filename
, ou seja, com o arquivo a ser processado como argumento para o script.