получить частое имя пользователя из команды 'last' в unix - за исключением - PullRequest
4 голосов
/ 11 августа 2009

Если я запускаю это на OS X:

last -10 | awk '{print $1}'

Я получаю: измельчить
измельчить
измельчить
chrihopk
перезагрузка
выключение
измельчить
измельчить
измельчить
chrihopk

Как мне использовать sed или awk, чтобы получить наиболее частый пользователь chop?

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ ВОПРОСА:
Наша локальная учетная запись администратора влияет на результаты (имя пользователя: поддержка), и часто у нас есть новый стартер на коробке клиента.
Как я мог изменить

last -1  

, чтобы пропустить следующее и вернуть последнее действительное имя пользователя:

поддержка
перезагрузка
отключение

Спасибо

Ответы [ 6 ]

9 голосов
/ 11 августа 2009
bash$ last -10 | awk '{print $1}' | sort | uniq -c | sort -nr | head -1 | awk '{print $2}'

sort -un что-то делает, но я не уверен, что ...

bash$ echo -e 'bob\nbob\ncat\ncat\ncat\ndog'
bob
bob
cat
cat
cat
dog
bash$ echo -e 'bob\nbob\ncat\ncat\ncat\ndog' | sort | uniq -c | sort -nr
      3 cat
      2 bob
      1 dog
bash$ echo -e 'bob\nbob\ncat\ncat\ncat\ndog' | sort -un
bob
bash$ echo -e 'bob\nbob\ncat\ncat\ncat\ndog' | sort | uniq -c | sort -nr | head -n1 | awk '{print $2}'
cat
6 голосов
/ 11 августа 2009

Если хотите

  • хороший список пользователей в порядке возрастания с количеством входов в систему (материал $0!~/^$/ гарантирует, что пустые строки не будут учитываться):

    last | awk '$0!~/^$/ {print $1}' | sort | uniq -c | sort
    
  • имя пользователя с номером логина:

    добавить | tail -1 к коду выше.

  • то же, что и выше в awk (быстрее):

    last | awk '{a[$1]++}END{m=0;for(v in a){if(a[v]>m){m=a[v];u=v}}print m,u}'
    
  • имя пользователя только в awk:

    удалить последний m, из кода выше.

2 голосов
/ 12 августа 2009

просто awk

last -10 |awk '{ user[$1]++}
END{
    t=0
    for(i in user){
        if (user[i]>t) {
            t=user[i]
            u=i
        }
    }
    print t,u
}' 

с gawk вы можете использовать внутренние функции asort, asorti

1 голос
/ 11 августа 2009

Следующий конвейер предлагает отправную точку, которую, я уверен, можно оптимизировать:

last | awk '{A[$1] += 1; for (v in A) print A[v],v}' | sort -ur | head -n 1 | awk '{print $2}'
0 голосов
/ 26 августа 2009

В ответ на ваши изменения оставьте числовой аргумент для last и используйте egrep, например:

last | egrep -v 'support|reboot|shutdown'

затем направьте это в awk, как в других ответах.

0 голосов
/ 11 августа 2009

Если вы передадите это в сортировку, вы получите легко анализируемый список данных для поиска наиболее частого пользователя, хотя я не знаю, как найти этого пользователя без языка сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...