2010-04-14 4 views
27

Как получить последнюю непустую строку, используя tail под оболочкой Bash?Как получить последнюю непустую строку файла, используя хвост в Bash?

Например, my_file.txt выглядит следующим образом:

привет
Голя
бонжур
(пустая строка)
(пустая строка)

Очевидно, что если я tail -n 1 my_file.txt I получит пустую строку. В моем случае я хочу получить bonjour. Как мне это сделать?

+0

Что делать, если у вас есть пробелы/вкладки в конце файла? – ghostdog74

ответ

19

Вы можете использовать Awk:

awk '/./{line=$0} END{print line}' my_file.txt 

Это решение имеет преимущество, используя только один инструмент.

+4

Даунсайд: нужно прочитать файл WHOLE и назначить EACH LINE для awk-переменных -> Это может быть довольно интенсивным CPU и IO. –

+1

Да, решение прост, но далеки от эффективности. Эффективное решение будет открывать файл, искать его до конца и отсканировать назад. –

15

Как насчет использования grep, чтобы сначала отфильтровать пустые строки?

$ cat rjh 
1 
2 
3 


$ grep "." rjh | tail -1 
3 
+5

или вместо 'cat rjh | grep "." | tail -1 ', используйте' grep. rjh | tail -1 ' – amertune

+0

'grep". "Техника очень полезна, спасибо – Debugger

+0

может кто-то объяснить grep". " часть ? –

28

Используйте нолики, так что вам не придется читать весь файл:

tac FILE |egrep -m 1 . 
+3

На OS X, это 'gtac' – vault

+0

@vault не на Sierra, 2016. – gsamaras

+0

@gsamaras попробует прокручивать справа налево на сенсорной панели – vault

2

, если вы хотите исключить какие-либо пробелы, то есть пробелы/табуляции в конце строки, а не только пустые строки

awk 'NF{p=$0}END{print p}' file 
6

Вместо tac вы можете использовать tail -r если таковые имеются.

tail -r | grep -m 1 '.' 
+0

Какие версии 'tail (1)' имеют параметр '-r'? У него в GNU coreutils его нет, ср. http://debbugs.gnu.org/18808 –

1

Если tail -r нет в наличии, и вы не имеете egrep, следующие прекрасно работает:

tac $FILE | grep -m 1 '.'

Как вы можете видеть, это комбинация двух предыдущих ответов.