web-dev-qa-db-ja.com

Bashのtailを使用してファイルの最後の空でない行を取得するにはどうすればよいですか?

Bashシェルでtailを使用して最後の空でない行を取得するにはどうすればよいですか?

例えば、 my_file.txtは次のようになります。

こんにちは
ほら
bonjour
(空の行)
(空の行)

明らかに、tail -n 1 my_file.txt空行を取得します。私の場合、bonjourを取得します。それ、どうやったら出来るの?

34
Debugger

Awkを使用できます。

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

このソリューションには、1つのツールのみを使用するという利点があります。

25
Hai Vu

Tacを使用して、ファイル全体を読む必要はありません。

tac FILE |egrep -m 1 .
33
Jürgen Hötzel

grepを使用して最初に空白行を除外する方法はありますか?

$ cat rjh
1
2
3


$ grep "." rjh | tail -1
3
22
RichieHindle

tacの代わりにtail -rを使用できます(使用可能な場合)。

tail -r | grep -m 1 '.'
6
kalu

空白、つまり空行だけでなく、行末のスペース/タブを省略したい場合

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

tail -rは使用できず、egrepがありません。次のようにうまく機能します。

tac $FILE | grep -m 1 '.'

ご覧のとおり、これは前の2つの答えの組み合わせです。

1
Andy Forceno

最後の視覚的に空でない行を印刷します。

_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:]]'
_
0
jarno