我正在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 }'
即使您的输入未排序,这也会起作用。