#awk
Вопрос:
Я пытаюсь сохранить вывод top
команды в csv
файле. Я хочу проигнорировать первые шесть строк top
команды, которые содержат информацию, например, %cpu, MiB Mem и т. Д. Я использую awk
для достижения этого следующее:
$ top | awk "NR<=5 {next;} {print}
Вывод приведенной выше команды верен следующим образом:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
75597 mustans 20 0 21100 4292 3524 R 18.8 0.0 0:00.03 top
1945 mustans 20 0 5035316 296380 95244 S 6.2 1.8 35:58.70 gnome-shell
Выше выводится желаемый вывод, но через несколько секунд первые шесть строк также отображаются следующим образом:
top - 12:24:40 up 2 days, 23:58, 1 user, load average: 1.02, 0.83, 0.58
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
%Cpu(s): 1.1 us, 1.0 sy, 0.0 ni, 95.1 id, 2.8 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15906.9 total, 2265.8 free, 7633.8 used, 6007.3 buff/cache
MiB Swap: 7629.0 total, 7625.9 free, 3.1 used. 7260.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
747 systemd 20 0 24492 13784 9336 S 3.7 0.1 0:08.20 systemd-resolve
37955 mustans 20 0 7648180 2.0g 63944 S 3.7 12.7 94:16.16 java
Как я могу гарантировать, что в каждой refresh
top
команде первые несколько строк должны быть пропущены awk
. Спасибо!
Комментарии:
1. Я предлагаю взглянуть на
ps
и его-o
вариант, чтобы получить нужные столбцы.2. Лучший вариант-использовать
ps -o ...
. Если вы хотите продолжитьtop
, используйте-n 1
опцию, чтобы остановить итерацию после первой печати. После этого вы рассмотрите некоторые проблемы с выводом последовательностей ANSI.
Ответ №1:
Вывод канала сверху не начинается заново каждый раз, когда он обновляется, в итоге вы получаете длинный список строк, отправляемых в awk. Вы отбрасываете только первые 5 строк.
Вы можете перезапустить его и получить то, что хотите, используя часы, чтобы выполнять его самостоятельно каждую секунду, например watch -n 1 'top -n 1 | awk "NR<=5 {next;} {print}"'
Хотя это может быть не лучший способ сделать то, что вы пытаетесь сделать…. возможно, вы захотите рассмотреть возможность использования чего-то вроде ps
получения нужной вам информации и не использовать awk.
Ответ №2:
Я добился с помощью ps
команды вывода в нужном формате, т. Е. Удалил несколько начальных строк, а затем напечатал команду вместе с cpu %.
ps -eo cmd,%cpu -p$(pidof process1),$(pidof process2) | awk "NR==1 {next;} {print $1}