AWK resultado diferente

0

Eu estava pesquisando a lista de arquivos abertos com base nos processos Ips e AMD. Eu usei abaixo do comando

    for i in 'sudo netstat -tulpna|awk '{print $5}'|grep -E "[0-9]{3}"|grep -v "^192\|10"|cut -f1 -d ":"';do sudo netstat -tulpna|awk '/XXX.XXX.XXX.XXX/ {print $7}';done
    26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java
26181/java

Funciona bem se eu adicionar aspas simples e na condição awk /XXX.XXX.XXX.XXX/ dou um valor estático ele será impresso na 7ª coluna

Mas se eu usar aspas duplas e / $ i / variable

for i in 'sudo netstat -tulpna|awk '{print $5}'|grep -E "[0-9]{3}"|grep -v "^192\|10"|cut -f1 -d ":"';do sudo netstat -tulpna|awk "/$i/ {print $7}";done
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:62778          ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:35708         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40920         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40918         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:31211         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:35708         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40920         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40918         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:31211         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:35708         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40920         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40918         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:31211         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:35708         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40920         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:40918         ESTABLISHED 26181/java
tcp        0      0 XXX.XXX.XXX.XXX:443            XXX.XXX.XXX.XXX:31211         ESTABLISHED 26181/java

Quando deve ser apenas a impressão da coluna 7. O que eu estou perdendo aqui

    
por OmiPenguin 08.02.2018 / 09:15

2 respostas

3

Seu script awk :

awk "/$i/ {print $7}"

Aqui, $7 é expandido pelo shell e provavelmente está vazio, resultando no comando

awk '/something/ {print }'

Em vez disso, você pode escapar do $ in $7 do shell:

awk "/$i/ {print \}"

Está tudo bem em um pequeno script awk como este. Em um script mais complicado, provavelmente deve-se passar $i para awk usando -v variable="$i" e usar variable para match() contra as linhas (ou usar ~ como αғsнιη mostra ).

    
por 08.02.2018 / 09:32
1

Você deve primeiro passar $i como variável de for ...;do ... ;done para uma variável awk e, depois, corresponder ao seu valor como um padrão como abaixo:

... | awk -v list="$i" '$0 ~ list {print $7}'; done

veja Passe a variável shell como / pattern / to awk para mais.

    
por 08.02.2018 / 09:31

Tags