Czy jest jakiś sposób, aby polecenie cięcia odczytało tylko ostatnie pole?

13

Mam ciąg oddzielony spacją, który jest wyprowadzany przez polecenie, do którego lubię przesyłać potoki cut, używając -fd ' 'podziału na spacje. Wiem, że mogę użyć -f <n>do wyświetlenia numeru pola <n>, ale czy mogę ustawić wyświetlanie ostatniego pola, jeśli nie znam długości ciągu?

Czy też muszę korzystać z bardziej elastycznego narzędzia do edycji tekstu, takiego jak sedlub awk?

Arroniczny
źródło
Myślę, że polecenie cut nie obsługuje, ale nie jestem pewien, czy próbowałeś z cut -d '' -f-?
αғsнιη
3
Więcej sposobów na to: stackoverflow.com/questions/22727107/…
edwinksl 30.09.16
@ KasiyA -nsprawia, że ​​n od początku, n-jest od n do końca, i istnieje --complementopcja, która odwraca wybór. Ale nie ma sposobu, aby policzyć liczbę pól i działać na ich podstawie, o ile mogę powiedzieć.
Arronical

Odpowiedzi:

13

Nie, cutnie mogę tego zrobić. Możesz użyć dwóch revpoleceń, takich jak

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

ale zwykle jest łatwiejszy w użyciu awk:

echo 'foo bar baz' | awk '{print $(NF)}'
Florian Diesch
źródło
7

Możesz to zrobić tylko za pomocą powłoki, nie jest potrzebne żadne narzędzie zewnętrzne, używając rozszerzenia parametrów:

${var##* }

var##*odrzuci wszystko od początku do ostatniej spacji z parametru (zmienna) var.

Jeśli separatorem może być dowolny biały znak, np. Spacja lub tabulator, użyj klasy znaków [:blank:]:

${var##*[[:blank:]]}

Przykład:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg
heemayl
źródło
Mówiłem o zastosowaniu rozszerzenia parametrów w komentarzu do odpowiedzi Severusa Tuxa, ale pusta klasa znaków jest użyteczną informacją, dzięki.
Arroniczny
4

Osobiście podoba mi się odpowiedź Floriana Diescha. Ale jest i ta droga.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Wyjaśnienie:

wc -wpodaje liczbę słów. i cuttnie ostatnie słowo

EDYTOWAĆ:

Wymyśliłem inny sposób:

echo "Any random string here" | tac -s' ' | head -1
Severus Tux
źródło
Zgadza się, ale jest to prawdą, gdy delim jest spacją lub tabulatorem, a jeśli twoja delimacja nie jest taka sama, to się nie powiedzie
αғsнιη
Ładne myślenie boczne, chociaż jeśli ustawię a="my string here", mógłbym również użyć rozszerzenia parametrów ${a##* }.
Arronical
1
Tak, ale OP powiedział, że ma ciąg oddzielony spacjami.
Severus Tux,
2

Oto jeden za pomocą grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Jak to działa:

  • grep z -oDrukuj tylko pasujące (niepuste) części pasującej linii.
  • Wyrażenie regularne [^ ]*$dopasowuje wszystko od końca, aż do znalezienia spacji.

Kolejna wkładka od glenn jackman za pomocą perla

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
souravc
źródło