나는 awk
배우고 있다이것지도 시간. 이것은 매우 기본적인 것입니다.
파일에 프로세스 목록이 있고 ps aux > processes
튜토리얼에 따라 이제 awk '$2 ~ 14022, $2 ~ 14040'
이렇게 하면 PID가 14022에서 14040 사이인 프로세스 목록을 얻을 수 있습니다. 동일한 PID 범위 1746 - 1760을 시도했습니다. 그러나 PID가 1760보다 높은 프로세스를 출력합니다.
산출
$ awk '$2 ~ 1746, $2 ~ 1760 {print $1, $2, $11}' processes
root 1746 sudo
root 1750 wvdial
root 1751 /usr/sbin/pppd
dharmit 1772 /opt/google/chrome/chrome
dharmit 1788 /opt/google/chrome/chrome
dharmit 1790 /opt/google/chrome/chrome
root 1791 /sbin/udevd
dharmit 1827 /opt/google/chrome/chrome
dharmit 1830 /opt/google/chrome/chrome
dharmit 1846 /opt/google/chrome/chrome
dharmit 1850 gnome-terminal
dharmit 1856 gnome-pty-helper
dharmit 1857 bash
root 1902 [kworker/0:4]
dharmit 1940 /opt/google/chrome/chrome
root 1952 [kworker/1:0]
root 2104 /usr/sbin/anacron
root 2181 /usr/libexec/packagekitd
dharmit 2183 ps
왜 그런 상황이 있습니까? 내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
범위의 끝이 입력 라인과 일치하지 않는 범위 일치를 지정하고 있습니다. 즉, pid 1760을 가진 프로세스가 없습니다.
awk는 예상대로 필드가 숫자 필드임을 알고 PID를 숫자 범위와 비교하므로 여기서는 똑똑하지 않습니다. 대신 단순히 범위의 시작과 끝 부분에 있는 문자열과 일치하며, 범위 끝 부분에 일치 항목이 없으면 범위가 파일 끝까지 효과적으로 확장됩니다.
귀하의 예에서 범위를 끝까지 밀면 1751
원하는 것을 얻을 수 있습니다.
또는 필드를 숫자로 비교합니다.
awk '$2 >= 14022 && $2 <= 14040 { print }'
입력이 정렬되지 않은 경우에도 작동합니다.