Получение использования памяти из вывода «ps aux» с помощью awk - PullRequest
4 голосов
/ 17 апреля 2010

Я должен решить упражнение, используя awk. По сути, мне нужно получить из команды 'ps aux' общее количество памяти для каждого пользователя и отформатировать его следующим образом:

User    Total%Mem
user1      3.4%
user2      1.5%

и т. Д.

Проблема, которую я не могу решить, заключается в следующем: как узнать, сколько пользователей вошли в систему? И как я могу сделать разные суммы для каждого из них?

Спасибо:)

Ответы [ 4 ]

9 голосов
/ 17 апреля 2010

Вам не нужно ничего знать об этом. Все, что вам нужно знать, это:

  1. У вас есть столбчатый вывод с одинаковым количеством столбцов в каждой строке.
  2. Первый столбец - это имя пользователя для входа.
  3. 4-й столбец - это столбец% MEM.
  4. Awk автоматически инициализирует переменную в 0.
  5. Ключи индекса Awk являются произвольными значениями:)

    ps aux | awk 'NR != 1 {x[$1] += $4} END{ for(z in x) {print z, x[z]"%"}}'
    

Я передаю ввод в awk, а затем говорю пропустить строку 1 (NR! = 1). Затем для каждой отдельной строки это выглядит по-английски так:

в массиве 'x', увеличить значение в 'x [username]' по значению в 4-м колонка. Если ключ массива не существует тем не менее, создайте его, инициализированный в 0, и затем увеличьте , что на значение в 4-й столбец.

Когда Awk делает это для каждой отдельной строки, он запускает код в блоке 'END', который говорит, что нужно распечатать каждое имя пользователя (z в x), и связанное с ним окончательное агрегированное значение с этим пользователем (x [z]), за которым следует «%».

Если вы хотите, чтобы он строился построчно, вы можете использовать одни и те же основные правила, но добавить печать после каждой строки вместо «END»:

ps aux | awk 'NR != 1 {x[$1] += $4; print $1, x[$1]}'
1 голос
/ 23 октября 2018

Хорошо отформатировано, отсортировано по наибольшим потребителям, переменная номера столбца
Установите coln = 6, чтобы увидеть килобайты

ps aux | awk 'BEGIN {coln=4; getline; col=$coln};   
{arr[$1]+=$coln};
END {printf ("%15s %s\n", "USER",col);
     for (i in arr) {printf("%15s %s\n", i,arr[i])|"sort -k 2,2rn" }
    }'
1 голос
/ 17 апреля 2010
ps -eo user,pmem| awk 'NR>1{u[$1]+=$2}END{for(i in u)print "user: "i",mem: "u[i]}'
1 голос
/ 17 апреля 2010

Вы бы использовали ассоциативные массивы для накопления памяти на пользователя. Вам не нужно знать, сколько пользователей, потому что вы можете перебирать массив. Почему бы вам не показать, что у вас есть до сих пор?

Вот базовая структура в псевдокоде, которая будет иметь такая программа:

BEGIN { print headers, do other setup if needed }

{ 
    add the %mem field to the array element indexed by the user name
}

END {
    for each element in the array
        print the name and the total
        add the total to a grand total
    print the grand total
}
...