Awk: intervalo de PIDs

2

Estou aprendendo awk do este tutorial. É bem básico.

Eu tenho uma lista de processos em um arquivo que eu obtive fazendo ps aux > processes Agora, de acordo com o tutorial, fazendo awk '$2 ~ 14022, $2 ~ 14040' deve dar uma gama de processos com PID variando de 14022 a 14040. Eu tentei o mesmo com PID faixa 1746 - 1760. Mas gera os processos que têm PID acima de 1760.

Saída

$ 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

Por que isso acontece? O que estou perdendo aqui?

    
por Dharmit 27.07.2011 / 04:53

1 resposta

6

Você está especificando uma correspondência de intervalo em que o final do intervalo não corresponde a nenhuma das linhas de entrada, ou seja, não há processo com o pid 1760.

O awk não está sendo inteligente aqui e sabe que o campo é um campo numérico e compara os PIDs com um intervalo numérico, como você parece estar esperando. Em vez disso, é simplesmente combinar uma cadeia de caracteres para o início e o final do intervalo, e sem correspondência no final do intervalo, o intervalo se estende efetivamente até o final do arquivo.

No seu exemplo, se você terminar o intervalo em 1751 , verá que consegue o que deseja.

Como alternativa, compare o campo numericamente:

awk '$2 >= 14022 && $2 <= 14040 { print }'

Isso funcionará mesmo que sua entrada não esteja classificada.

    
por 27.07.2011 / 05:03

Tags