Как получить последнюю непустую строку файла, используя tail в Bash? - PullRequest
33 голосов
/ 14 апреля 2010

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

Например, my_file.txt выглядит так:

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

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

Ответы [ 7 ]

33 голосов
/ 14 апреля 2010

Используйте tac, чтобы вам не приходилось читать весь файл:

tac FILE |egrep -m 1 .
25 голосов
/ 15 апреля 2010

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

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

Преимущество этого решения заключается в использовании только одного инструмента.

21 голосов
/ 14 апреля 2010

Как насчет использования grep для первой фильтрации пустых строк?

$ cat rjh
1
2
3


$ grep "." rjh | tail -1
3
6 голосов
/ 26 декабря 2013

Вместо tac вы можете использовать tail -r, если доступно.

tail -r | grep -m 1 '.'
3 голосов
/ 15 апреля 2010

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

awk 'NF{p=$0}END{print p}' file
1 голос
/ 26 апреля 2016

Если tail -r недоступен и у вас нет egrep, хорошо работает следующее:

tac $FILE | grep -m 1 '.'

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

0 голосов
/ 15 марта 2019

Вывести последнюю визуально непустую строку:

tac my_file.txt | grep -vm 1 '^[[:space:]]*$'

или

awk 'BEGIN{RS="\r?\n[[:space:]]*"}END{print}' my_file.txt

Возможно, \r? необходим для текстовых файлов DOS / Windows. Классы символов, такие как [:space:], работают с GNU-версиями awk (т.е. gawk) и grep как минимум. В некоторых других реализациях вы должны перечислять пробельные символы вручную в коде, то есть заменить [:space:] на \t \n\f\r\v. Я не знаю, как правильно обращаться с символами возврата (\b) в файле.

Следующее работает только с [:space:]:

tac my_file.txt | grep -m 1 '[^[:space:]]'
...