Извлечь последнее слово файла в bash/sed / awk

Я хочу извлечь последнее слово файла, скажем a.txt в bash/sed / awk.

Как я могу это сделать?

9 ответов


чтобы получить последнее слово в последней строке:

awk 'END {print $NF}' file

обновление.

если вы хотите использовать awk и убедитесь, что есть такое слово, то так:

tac a.txt | awk 'NF{print $NF; exit}'

tac печать файла в обратном порядке. NF перед {} блок заставляет его работать, когда строка не пуста. В этом случае выводится последнее поле (NF обозначает количество полей, так что $NF является последним), а затем выходит.

тест

$ cat a
hello my name
is blabla
and this is
my comment.
                      <--- note an empty line
$ tac a | awk 'NF{print $NF; exit}'
comment.

или так же, как предложено Кент!--29-->:

awk '{w=NF?$NF:w} END{print w}' file

w=$NF?$NF:w. Это тернарный оператор: if NF>0 (без пустой строки), set w до последнего поля. В противном случае, оставь все как есть. Наконец, в END{}, распечатать последнее сохраненное слово.


в случае, если вы хотите сделать это с sed, вы можете использовать это, что работает в случае, если нет пустых строк в конце:

sed -n '${s/.* //; p}' a.txt

объяснение

  • $ обозначает последнюю строку файла. В в этом случае делайте то, что внутри {}.
  • s/.* //; p удалить все до последнего места. Тогда print p.

попробуйте эту команду awk также,

awk -v RS="" '{print $NF}' file

RS="" превращает все записи в файле в одну единственную запись. А потом ... --2--> печатает последнее поле этой единственной записи.


вы также можете использовать команду sed ,

$sed -nr '${s/.* (.*)$//pg}' File_name

использование tail и grep:

tail -1 myFile.txt | grep -oE '[^ ]+$'

вы также можете получить последнее слово с grep и tail:

<a.txt grep -o '\w\+' | tail -n1

sed вариант для поддержки пустой последней строки (если есть):

sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt

Это может сработать для вас (GNU sed):

sed -r '/\w/{s/.*\W(\w+)\W*$//;h};$!d;x;/./!d' file

сохраняет последнее слово текущей строки в пространстве удержания, затем удаляет строку. В конце файла он извлекает последнее слово и распечатывает его, если только не было слова, в этом случае он удаляет пустую строку.

альтернативный способ-проглотить весь файл в память:

sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$//p;d' file

 sed -n '/^$/!{$ s/.* \(\w*\)$//p}'

это опустит пустые строки и напечатает последнее слово в последней непустой строке.

  • /^$/! найти непустые строки
  • $ s / в последней строке заменить
  • .* (\w*)$ захватите что-нибудь между ()
  • \1 Замените строку для группы захвата ()
  • п печати