2013-03-26 10 views
18

muszę wyodrębnić PID, UID i poleceń pól z „PS” i próbowałem to tak:Korzystanie bash ps i rozebrane

ps -L u n | cut -f 1,2,13

Z jakiegoś powodu, to zachowuje się jak tam nie ma wyciąć polecenie w ogóle. Po prostu zwraca normalne wyjście PS. Następnie wypróbowałem

ps -L u n | tr -s " " | cut -d " " -f 1,2,13 i to zwraca całkowitą liczbę bzdur. Następnie próbowałem grać z nim i z tego:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14

i to jakoś zwraca czego potrzebuję (prawie, a ja nie rozumiem, dlaczego to niemal działa), poza tym, że wycina polu Polecenie w środku tego. Jak mogę uzyskać to, czego potrzebuję?

Odpowiedz

33

ps drukuje się separatory przestrzeni, ale cut bez -d wykorzystuje znak tabulatora. tr -s ściśnie przestrzeń, aby uzyskać więcej żądanej separacji, ale pamiętaj, że istnieje początkowy zestaw spacji (ściśnięty do jednego), dlatego musisz dodać 1 do każdego pola. Ponadto w poleceniach dla każdego słowa znajdują się spacje. To powinno działać:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14- 
12

Czy istnieje jakiś szczególny powód użycia cięcia?

myślę, że to zrobi, co chcesz:

ps -eopid,uid,cmd 
+0

Jestem początkujący więc próbuje co myślę. Powinienem przeczytać bardziej szczegółowo strony man. Dzięki – darxsys

+0

Nie każdy system Unix oferuje te opcje dla 'ps', podczas gdy każdy Unix zapewnia' cut'. – sfstewman

+0

Zarówno "-e" jak i "-o" są określone przez POSIX. [The spec] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html) wspomina niektóre z trudności standaryzacji 'ps' ze względu na duże różnice pomiędzy wcześniejszymi implementacjami BSD i System V . – chepner

11

Można użyć awk, aby oczyścić swoje polecenia, tak jak poniżej:

ps -L u n | awk '{ print $1,$2,$13 }'