shell脚本如何逐行读取文件并删除数量小于20%的行

shell脚本如何逐行读取文件并删除数量小于20%的行

我需要帮助。我有这个文件,我想使用 for 循环逐行读取它,并删除列表 %CPU 中少于 20% 的行。

%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1
 3  9092 ashti     1000 nautilus         1.2
 2  9109 ashti     1000 gnome-terminal-  0.9
 1 1248 ashti     1000 Xorg             2.6
 0  1375 ashti     1000 VBoxClient       0.0
 0  9118 ashti     1000 bash             0.1
 0   269 root         0 systemd-journal  2.8

我想要像这个例子

%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1

并保存在新文件中。

此致

答案1

grep

grep -e "^%" -e "^[2-9][1-9]" file | column -t

column -t让它变得漂亮:

%CPU  PID   USER   UID   COMMAND      %MEM
71    9136  ashti  1000  firefox      4.6
36    1432  ashti  1000  gnome-shell  8.6
25    9100  ashti  1000  gedit        1.1

答案2

带保留头,awk表达式:

$ awk 'NR==1 || (NR > 1 && $1 > 20)' file
%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1

答案3

对于此任务,循环for不是一个好的选择 - 有关原因的讨论,请参见示例

我个人的选择是米勒:

$ mlr --pprint filter -x '${%CPU} < 20' file > newfile

$ cat newfile
%CPU PID  USER  UID  COMMAND     %MEM
71   9136 ashti 1000 firefox     4.6
36   1432 ashti 1000 gnome-shell 8.6
25   9100 ashti 1000 gedit       1.1

相关内容