Linux 如何根据第6个字段内容对行进行grep
我想知道如何根据mem使用情况过滤线路:我想只找到(RES mem使用)超过5GB的PID 明确地说,我有以下几行Linux 如何根据第6个字段内容对行进行grep,linux,bash,awk,sed,grep,Linux,Bash,Awk,Sed,Grep,我想知道如何根据mem使用情况过滤线路:我想只找到(RES mem使用)超过5GB的PID 明确地说,我有以下几行 20697 user 20 0 357m 24m 19m S 19.0 0.1 887:15.00 pulseaudio 13017 user 20 0 8381m 3.7g 35m S 127.7 7.9 803:11.96 MATLAB 12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:4
20697 user 20 0 357m 24m 19m S 19.0 0.1 887:15.00 pulseaudio
13017 user 20 0 8381m 3.7g 35m S 127.7 7.9 803:11.96 MATLAB
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12548 user 20 0 8797m 3.5g 13m S 101.0 7.4 802:21.00 MATLAB
12785 user 20 0 8543m 3.6g 35m S 101.0 7.6 804:36.81 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
我只想grep第6个字段大于5GB的行
编辑:注意排序并不重要。仅选择超出阈值的行非常重要
谢谢 不能从命令行使用排序选项,但可以使用变通方法来完成此操作
- 启动顶部(正常模式)
- 设置顺序(按存储器顺序:O n)
- 写入配置文件(W)
- 退出顶部
- 使用流输入和grep
- 对于订购或其他操作,请选择awk
- 如果您不介意使用awk
$ cat n.txt
20697 user 20 0 357m 24m 19m S 19.0 0.1 887:15.00 pulseaudio
13017 user 20 0 8381m 3.7g 35m S 127.7 7.9 803:11.96 MATLAB
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12548 user 20 0 8797m 3.5g 13m S 101.0 7.4 802:21.00 MATLAB
12785 user 20 0 8543m 3.6g 35m S 101.0 7.6 804:36.81 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
$ awk '{if($6>=5) {print}}' n.txt
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
使用
gawk
:
$ cat n.txt
20697 user 20 0 357m 24m 19m S 19.0 0.1 887:15.00 pulseaudio
13017 user 20 0 8381m 3.7g 35m S 127.7 7.9 803:11.96 MATLAB
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12548 user 20 0 8797m 3.5g 13m S 101.0 7.4 802:21.00 MATLAB
12785 user 20 0 8543m 3.6g 35m S 101.0 7.6 804:36.81 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
$ gawk '
BEGIN{
k=1024;
m["k"]=k;
m["m"]=k*k;
m["g"]=k*k*k;
}
{
patsplit($6, a, "([0-9.]*)|([kmg])");
value=a[1]*m[a[2]];
if (value>5*k*k*k) print;
}' n.txt
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12909 user 20 0 12g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
更优化(不太通用)的版本:
3088用户20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
也应该被打印出来。几乎,它需要首先选择第6个字段以“g”结尾,然后确保其值大于5。既然它已经转换了顶部的大小,为什么还要进行转换呢?你可以搜索g。如果它在最后说m,那么它比gig还小,所以你的转换是对cpu的浪费。有什么错误吗?全部/无)?谢谢。短小而优雅。
$ cat n.txt
20697 user 20 0 357m 24m 19m S 19.0 0.1 887:15.00 pulseaudio
13017 user 20 0 8381m 3.7g 35m S 127.7 7.9 803:11.96 MATLAB
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12548 user 20 0 8797m 3.5g 13m S 101.0 7.4 802:21.00 MATLAB
12785 user 20 0 8543m 3.6g 35m S 101.0 7.6 804:36.81 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
$ gawk '
BEGIN{
k=1024;
m["k"]=k;
m["m"]=k*k;
m["g"]=k*k*k;
}
{
patsplit($6, a, "([0-9.]*)|([kmg])");
value=a[1]*m[a[2]];
if (value>5*k*k*k) print;
}' n.txt
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12909 user 20 0 12g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB
$ awk '$6 ~ /^[0-9.]*g$/{if((0 + $6)>5) print}' n.txt
$ awk '$6~/g/ && ($6+0)>5' file
12654 user 20 0 11.2g 6.1g 10m S 104.8 13.0 784:41.07 MATLAB
3088 user 20 0 17.4g 12g 11m S 101.0 26.3 2043:48 MATLAB
12909 user 20 0 12.1g 5.5g 28m S 99.1 11.8 796:01.45 MATLAB
13154 user 20 0 10.1g 5.6g 10m S 99.1 11.8 797:07.14 MATLAB