Bashシェルでtail
を使用して最後の空でない行を取得するにはどうすればよいですか?
例えば、 my_file.txt
は次のようになります。
こんにちは
ほら
bonjour
(空の行)
(空の行)
明らかに、tail -n 1 my_file.txt
空行を取得します。私の場合、bonjour
を取得します。それ、どうやったら出来るの?
Awkを使用できます。
awk '/./{line=$0} END{print line}' my_file.txt
このソリューションには、1つのツールのみを使用するという利点があります。
Tacを使用して、ファイル全体を読む必要はありません。
tac FILE |egrep -m 1 .
grep
を使用して最初に空白行を除外する方法はありますか?
$ cat rjh
1
2
3
$ grep "." rjh | tail -1
3
tac
の代わりにtail -r
を使用できます(使用可能な場合)。
tail -r | grep -m 1 '.'
空白、つまり空行だけでなく、行末のスペース/タブを省略したい場合
awk 'NF{p=$0}END{print p}' file
tail -r
は使用できず、egrep
がありません。次のようにうまく機能します。
tac $FILE | grep -m 1 '.'
ご覧のとおり、これは前の2つの答えの組み合わせです。
最後の視覚的に空でない行を印刷します。
_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:]]'
_