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"
variable
match()
~
보여주다).
답변2
먼저 $i
변수를 for ...;do ... ;done
전달한 awk
다음 해당 값을 다음과 같은 패턴으로 일치시켜야 합니다.
... | awk -v list="$i" '$0 ~ list {print $7}'; done
바라보다쉘 변수를 awk에 /pattern/으로 전달합니다.더 알아보기.