Игнорирование первых нескольких строк верхней команды с помощью awk не работает

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