awk:PID範囲

awk:PID範囲

私は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 }'

入力が揃っていない場合でも機能します。

関連情報