0

I was searching for List of Open Files based on Ips amd Processes. I used below command

    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

Works ok if i add single quote and in awk condition /XXX.XXX.XXX.XXX/ i give static value it will print 7th column

But if i use Double quotes and /$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

When it should only be printing column 7. What i'm missing here

OmiPenguin
  • 4,308

2 Answers2

3

Your awk script:

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

Here, $7 is expanded by the shell and is most likely empty, resulting in the command

awk '/something/ {print }'

Instead, you may escape the $ in $7 from the shell:

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

This is ok in a short awk script like this. In a more complicated script, one should probably pass $i into awk using -v variable="$i" and use variable to match() against the lines (or use ~ as αғsнιη shows).

Kusalananda
  • 333,661
1

You should first pass $i as variable of for ...;do ... ;done to an awk variable then match it's value as a pattern like below:

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

see Pass shell variable as a /pattern/ to awk for more.

αғsнιη
  • 41,407