Chciałbym uzyskać numer rating
jako wynik z tego
# nc localhost 9571
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94
Mogę to zrobić w ten sposób
# nc localhost 9571 | grep rating | cut -d: -f2
94
ale awk
zamiast tego można zastosować prostsze rozwiązanie?
Odpowiedzi:
źródło
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?Quanta mnie pobił, ale dołączę
sed
wariant, jeśli masz taką skłonność:To samo mówi MadHatter. Twoje obecne rozwiązanie jest całkowicie solidne. (Chociaż chciałbym pozdrowić
"^rating:"
zamiast słowa, aby upewnić się, że otrzymujesz tylko tę linię, którą chcesz.)źródło
sed
! Jest tak niewykorzystany i niedoceniany ...Możesz także po prostu użyć powłoki:
źródło
nc
. Ładny!tak, możesz (i powinieneś) użyć (jednego) awk zamiast (dwóch) grep i cut:
Pamiętaj, aby dopasować swoją linię tak dobrze, jak to możliwe, aby uniknąć brzydkich błędów.
/rating/
Pracuje,/^rating/
jest lepszy (bezpieczniejszy),/^rating:/
jest najlepszy (w tym przypadku).źródło
To może:
(Nie wiem, co robisz z localhost powyżej, więc wykorzystałem twój wynik jako dane wejściowe do mojej komendy awk, a następnie zastąpiłem „cat” „nc ...” - ale powinno być w porządku.)
Ale dlaczego miałbyś to zrobić? UNIX polega na tym, aby mieć wiele małych narzędzi, z których każde robi jedną rzecz dobrze, połączonych razem za pomocą potoków, zamiast używać większych narzędzi wielofunkcyjnych. Musisz wybrać pojedynczą pasującą linię, wybierz jedno pole z niej:
grep
wybiera linie z dopasowaniami icut
wybiera pola z linii wejściowych; są idealne do tego zadania. Ale jeśli naprawdę chcesz zrobić to wszystko w jednym z awk, cóż, proszę bardzo.źródło
grep
icut
wymaga spawnowania dwóch procesów, a użycieawk
(lubsed
) wymaga tylko jednego. Spawnowanie procesu jest drogie obliczeniowo. Ponadto, w przeciwieństwie do używaniaperl
lubruby
(i innych),sed
iawk
są znacznie lżejsze z przodu.Chociaż odpowiedź quanty jest najłatwiejsza i ta, którą też napisałbym, założę się, że nie wiedziałeś, że GNU awk (gawk) może również robić sieci ? Możesz napisać całą rzecz za pomocą awk, jeśli naprawdę chcesz:
Może to być przydatne, jeśli serwer nie ma zainstalowanego nc, nc ma ograniczone uprawnienia lub jeśli naprawdę lubisz awk.
źródło
Możesz także użyć sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Zapewni to, że „ocena” rozpocznie linię, a cyfry będą następować po
rating:
źródło
Jeśli Perl jest opcją:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
autosplits każdą linię w@F
tablicy-F:
używa:
jako separatora pól, zamiast domyślnej spacji/rating/
zwraca true, jeśli wyrażenie regularne jest$F[1]
drugim elementem@F
tablicy.Tablice Perla zaczynają się od elementu 0, podczas gdy awk zaczyna się od 1 $
źródło