группировать и сортировать | время последнего входа пользователей [дубликат]

Usando Perl, y asumiendo que los datos están ubicados enfile:

$ perl -ne '/^(\w+)\s+(\d+)$/ && printf("%s\t%s\n", $1, "." x $2)' file
root   .....
xuser  ...
yuser  .

También puede aplicar esto en un flujo de datos:

somecommand | perl -ne '...as above...'

El script de Perl hace coincidir la cadena inicial y el número en la entrada, y genera la cadena y el número apropiado de puntos, con un carácter de tabulación en -en medio.


Con un pequeño ajuste del (anterior para poder leer la salida uniq -c, que tiene el número primero ), lo siguiente obtendría la cantidad de procesos en ejecución para cada usuario y mostraría las cuentas como puntos:

$ ps -ax -o user= | sort | uniq -c | perl -ne '/^\s*(\d+)\s+(\w+)$/ && printf("%-10s%s\n", $2, "." x $1)'
_dbus    .
_dhcp    .
_ntp     ..
_pflogd  .
_slaacd  ..
_smtpd   .....
_smtpq   .
_syslogd .
_unbound .
kk       ................
root     ..........................

El comando pspodría necesitar modificaciones para generar lo correcto en Linux (Estoy usando OpenBSD aquí, pero parece que también funciona correctamente en Ubuntu ). El script de Perl ha cambiado desde la primera variación para que lea correctamente la salida uniq -cy formatea las líneas para permitir nombres de usuario de 10 o menos de longitud.

-1
30.05.2019, 09:54
2 ответа
$ sort -t, -k1,1 -k2,2r file | sort -t, -u -k1,1
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

Первый sortсортирует данные по пользовательским и обратным датам. Результат этого шага выглядит как

user1,2019-05-23
user1,2019-05-22
user1,2019-05-21
user2,2019-05-21
user2,2019-05-20
user3,2019-05-29
user3,2019-05-24
user4,2019-05-28
user4,2019-05-25

Второй sortсортирует только по пользователям и сохраняет только один экземпляр строк каждого пользователя (первого найденного ).

1
28.01.2020, 05:09

Как указано в комментариях, этот вопрос задавался ранее, и было дано несколько ответов. Я хотел бы добавить еще один:

sort -r input.csv | awk -F, '!a[$1]++' | sort

Пробный запуск:

$ sort -r input.csv | awk -F, '!a[$1]++' | sort
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

Пояснение:

Вы уже знаете, как вывести первое вхождение первого столбца; если вам нужен последний, вам не нужно больше ломать голову :просто отсортируйте и переверните список с помощью sort -r. В качестве последнего шага и только в том случае, если вам нужно отсортировать результат, снова направьте канал на sort.


Без труб:

Вы также можете решить эту проблему с помощью одной команды. Если входной файл отсортирован (, как в вашем примере):

awk -F, '{a[$1]=$2}END{for(k in a){print k","a[k]}}' input.csv

иначе:

awk -F, '$2>a[$1]{a[$1]=$2}END{for(k in a){print k" "a[k]}}' input.csv
0
28.01.2020, 05:09

Теги

Похожие вопросы