AWK 다른 결과

AWK 다른 결과

Ips amd 프로세스를 기반으로 열린 파일 목록을 검색하고 있습니다. 나는 다음 명령을 사용합니다

    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

작은 따옴표를 추가하면 awk 조건 /XXX.XXX.XXX.XXX/에서 제대로 작동하고 정적 값을 제공하면 일곱 번째 열이 인쇄됩니다.

하지만 큰따옴표와 /$i/ 변수를 사용하면

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

열 7만 인쇄해야 하는 경우. 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

귀하의 awk스크립트:

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

여기서는 $7쉘에 의해 확장되고 비어 있을 가능성이 높으므로 다음 명령이 생성됩니다.

awk '/something/ {print }'

대신 쉘에서 탈출할 수 있습니다 $.$7

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

awk이와 같은 짧은 스크립트에서는 괜찮습니다. 더 복잡한 스크립트에서는 아마도 이 줄에 대해 using 및 use to $i로 전달해야 합니다(또는 as로 사용).awk-v variable="$i"variablematch()~보여주다).

답변2

먼저 $i변수를 for ...;do ... ;done전달한 awk다음 해당 값을 다음과 같은 패턴으로 일치시켜야 합니다.

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

바라보다쉘 변수를 awk에 /pattern/으로 전달합니다.더 알아보기.

관련 정보