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?


Myślę, że polecenie cut nie obsługuje, ale nie jestem pewien, czy próbowałeś z cut -d '' -f-?
αғsнιη


@ 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)}'

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.