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

即使您的输入未排序,这也会起作用。

相关内容