Как вывести список команд, отсортированных по пользователю? - PullRequest
3 голосов
/ 06 октября 2019

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

1 UID PID PPID C STIME TTY TIME CMD
2 adz110 5344 5334 0 08:47 pts /2 00:00:00 bash
3 dmq292 6908 6854 0 Jun04 pts /1 00:00:00 bash
4 adz110 7227 7150 0 Jul11 pts /9 00:00:00 who
5 erg474 7466 7461 0 08:54 pts /10 00:00:00 ls
6 dmq292 7966 7960 0 Jun04 pts /13 00:00:00 assign1 . sh if of
7 xle135 8983 8636 0 08:59 pts /15 00:00:00 ssh ctf . cs . utsarr . net
8 zeh458 9057 1980 0 08:59 pts /7 00:00:00 vim prog . c
9 rslavin 9150 9139 0 08:59 pts /16 00:00:00 ps - af
10 xle135 8636 8628 0 08:58 pts /15 00:00:00 bash

К сожалению, я не могу использовать какие-либо параметры команды сортировки для этого назначения. Я могу использовать сортировку, просто нет вариантов. Прежде всего, мне придется использовать awk для этого. У меня есть вывод довольно близко к тому, как мне это нужно, но не совсем там. Вот как он печатает:

User: adz110
       bash
User: dmq292
       bash

User: erg474
       ls

User: xle135
       ssh
User: zeh458
       vim
User: rslavin
       ps

Итак, он больше не перечисляет adz110, dmq292 и xle135 дважды. Однако вторая команда, которую выполнил каждый пользователь, отсутствует. Повозившись с ним, я заставил его распечатать эту информацию, но это была целая строка, и она распечатала бы одного пользователя ниже, где мне это было нужно.

gawk '/^[a-z]/ { if(!x[$1]++) print "User: "($1)"\n\t""   "$8; else if(x[$1]++) print "\t   "x[$NF] };

'

Это должен был быть конечный результат:

User : adz110
2           bash
3           who
4 User : dmq292
5           bash
6 assign1 . sh if of
7 User : erg474
8           ls
9 User : xle135
10          bash
11          ssh ctf . cs . utsarr . net
12 User : zeh458
13          vim prog . c

Ответы [ 2 ]

2 голосов
/ 06 октября 2019
$ tail +2 file | sort -k2,2 |
    awk '$2!=prev{print "User:", $2; prev=$2} {sub(/^([^ ]+ +){9}/,"\t")} 1'
User: adz110
        bash
        who
User: dmq292
        bash
        assign1 . sh if of
User: erg474
        ls
User: rslavin
        ps - af
User: xle135
        bash
        ssh ctf . cs . utsarr . net
User: zeh458
        vim prog . c
2 голосов
/ 06 октября 2019

Не могли бы вы попробовать следующее (используя комбинацию sort + awk).

РЕДАКТИРОВАТЬ1: Согласно хорошему совету Эда сэра, я добавляюСледующая команда, которая будет следить за тем, чтобы внутри команды приходили моменты времени, НЕ должна их удалять.

Давайте рассмотрим следующий файл: Input_file:

cat Input_file
1 UID PID PPID C STIME TTY TIME CMD
2 adz110 5344 5334 0 08:47 pts /2 00:00:00 bash
3 dmq292 6908 6854 0 Jun04 pts /1 00:00:00 bash
4 adz110 7227 7150 0 Jul11 pts /9 00:00:00 who
5 erg474 7466 7461 0 08:54 pts /10 00:00:00 ls
6 dmq292 7966 7960 0 Jun04 pts /13 00:00:00 assign1 . sh if of
7 xle135 8983 8636 0 08:59 pts /15 00:00:00 ssh ctf . cs . utsarr . net
8 zeh458 9057 1980 0 08:59 pts /7 00:00:00 vim prog . c
9 rslavin 9150 9139 0 08:59 pts /16 00:00:00 ps - af
10 xle135 8636 8628 0 08:58 pts /15 00:00:00 bash
4 adz110 7227 7150 0 Jul11 pts /9 00:00:00 grep 'pts /7 '11:00 foo'
4 adz110 7227 7150 0 Jul11 pts /9 00:00:00 grep 1 UID PID PPID C STIME TTY TIME CMD

Теперь код выглядит следующим образом:

sort -k2 Input_file | 
awk '
$0 ~ /^1 UID PID PPID C STIME TTY TIME CMD$/{
  next
}
prev!=$2 && prev{
  print "user:   " prev ORS "\t" val
  prev=val=""
}
{
  prev=$2
  match($0,/[0-9][0-9]:[0-9][0-9]:[0-9][0-9].*/)
  match_val=substr($0,RSTART+RLENGTH)
  val=(val?val ORS "\t":"")match_val
}
END{
  if(prev){
    print "user:   " prev ORS "\t" val
  }
}'

Вывод будет следующим:

user:  adz110
        bash
        grep 1 UID PID PPID C STIME TTY TIME CMD
        grep 'pts /7 '11:00 foo'
        who
user:  dmq292
        bash
        assign1 . sh if of
user:  erg474
        ls
user:  rslavin
        ps - af
user:  xle135
        bash
        ssh ctf . cs . utsarr . net
user:  zeh458
        vim prog . c


sort -k2 Input_file | 
awk '
$0 ~ /UID PID PPID C STIME TTY TIME CMD/{
  next
}
prev!=$2 && prev{
  print "user:   " prev ORS "\t" val
  prev=val=""
}
{
  prev=$2
  sub(/.*:00 /,"")
  val=(val?val ORS "\t":"")$0
}
END{
  if(prev){
    print "user:   " prev ORS "\t" val
  }
}'

Вывод будет следующим:

user:   adz110
        bash
        who
user:   dmq292
        bash
        assign1 . sh if of
user:   erg474
        ls
user:   rslavin
        ps - af
user:   xle135
        bash
        ssh ctf . cs . utsarr . net
user: zeh458
      vim prog . c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...