Czy istnieje sposób określenia ogranicznika pola dla większej liczby spacji za pomocą polecenia wycinania? (jak „” +)? Na przykład: w poniższym ciągu chciałbym osiągnąć wartość „3744”, jaki ogranicznik pola powinienem powiedzieć?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d' '
nie jest tym, czego chcę, ponieważ dotyczy tylko jednego miejsca.
awk
nie jest tym, czego szukam, ale jak zrobić z „cięciem”?
dzięki.
tr
pokazanej tutaj: stackoverflow.com/a/4483833/168143ps
+grep
można użyć,pgrep
który jest dostępny w większości nowoczesnych dystrybucji. Zwróci wynik dokładnie w takiej postaci, jakiej potrzebujesz.Odpowiedzi:
W rzeczywistości
awk
jest to dokładnie narzędzie, na które powinieneś zwrócić uwagę:lub możesz
grep
całkowicie rzucić, ponieważawk
wie o wyrażeniach regularnych:Ale jeśli z jakiegoś dziwnego powodu naprawdę nie możesz użyć
awk
, możesz wykonać inne prostsze rzeczy, takie jak zwinięcie wszystkich białych znaków w jednym miejscu:grep
Nawiasem mówiąc, ta sztuczka jest dobrym sposobem na uzyskanie tylkojboss
procesów, a niegrep jboss
jednego (to samo dotyczyawk
wariantu).grep
Proces będzie mieć dosłownegrep [j]boss
w swojej komendzie procesowego tak nie zostanie złapany przezgrep
siebie, która szuka klasa znaków[j]
następujeboss
.To sprytny sposób na uniknięcie
| grep xyz | grep -v grep
paradygmatu, z którego korzystają niektórzy ludzie.źródło
grep
Sztuczka wydaje się nie działać w plikach crontab. Jakiegokolwiek powodu?awk
wersja jest prawdopodobnie najlepszym sposobem, aby przejść, ale możesz również użyć,cut
jeśli najpierw ściśniesz powtórzenia za pomocątr
:źródło
tr -s ' '
jest naprawdę niezły! Mam nadzieję, że pamiętam to lepiej niżawk
W tym celu lubię używać polecenia tr -s
To ściska wszystkie białe spacje do 1 pola. W ten sposób polecenie cut, aby używało spacji jako separatora, jest honorowane zgodnie z oczekiwaniami.
źródło
Mam zamiar nominować
tr -s [:blank:]
jako najlepszą odpowiedź.Dlaczego chcemy używać cięcia? Ma magiczne polecenie, które mówi: „chcemy trzeciego pola i każdego pola po nim, pomijając pierwsze dwa pola”
Nie sądzę, aby istniało równoważne polecenie podziału awk lub perl, w którym nie wiemy, ile będzie pól, tzn. Nie wprowadzaj trzeciego pola przez pole X.
źródło
Krótsze / prostsze rozwiązanie: użyj
cuts
(nacięcie na sterydy, które napisałem)Zauważ, że
cuts
indeksy pól są zerowe, więc piąte pole jest określone jako 4http://arielf.github.io/cuts/
A jeszcze krótszy (w ogóle nie używając cięcia) to:
źródło
Można to obejść:
aby zastąpić wiele kolejnych spacji jednym.
źródło
\s
jest rozszerzeniem GNU sed. W systemie OS X można przekazać-E
flagę sed, aby włączyć rozszerzone wyrażenia regularne, a następnie użyć[[:space:]]
zamiast\s
:sed -E 's/[[:space:]]+/ /g'
Osobiście używam awk do takich zadań. Na przykład:
źródło
ps axu | awk '/[j]boss/ {print $5}'
.Alternatywnie, zawsze istnieje perl:
Lub jeśli chcesz uzyskać wszystkie pola zaczynające się od pola nr 3 (jak podano w jednej z odpowiedzi powyżej):
źródło
lsof
które próbowałem,lsof|perl -lane 'print $F[5]'
czasami dostaje 5 kolumnę, czasem 6Jeśli chcesz wybrać kolumny z danych wyjściowych ps, masz powód, aby nie używać opcji -o?
na przykład
Przydzielona minimalna szerokość kolumny, bez wypełnienia, tylko separator pojedynczego pola spacji.
Pid i vsz otrzymali 10 znaków szerokości, 1 separator pól spacji.
Używane w skrypcie: -
źródło
Innym sposobem, jeśli musisz użyć polecenia cut
W systemie Solaris zamień awk na
nawk
lub/usr/xpg4/bin/awk
źródło
Nadal podoba mi się sposób, w jaki Perl obsługuje pola z białą przestrzenią.
Pierwsze pole to $ F [0].
źródło
Moje podejście polega na zapisaniu PID w pliku w / tmp i znalezieniu właściwego procesu przy użyciu
-S
opcji dlassh
. To może być niewłaściwe użycie, ale działa dla mnie.Lepszym rozwiązaniem może być zapytanie o
SSH_PID
prawo przed jego zabiciem, ponieważ plik może być nieaktualny i zabiłoby to niewłaściwy proces.źródło