2010-04-14 4 views
27

Làm cách nào để nhận dòng không trống cuối cùng bằng cách sử dụng tail trong vỏ Bash?Làm cách nào để nhận dòng cuối cùng trống của một tệp bằng đuôi trong Bash?

Ví dụ, my_file.txt trông như thế này:

chào
hola
bonjour
(trống dòng)
(trống dòng)

Rõ ràng, nếu tôi làm tail -n 1 my_file.txt tôi sẽ nhận được một dòng trống. Trong trường hợp của tôi, tôi muốn có được bonjour. Làm thế nào để làm điều đó?

+0

nếu bạn có dấu cách/tab ở cuối tệp thì sao? – ghostdog74

Trả lời

19

Bạn có thể sử dụng AWK:

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

Giải pháp này có lợi thế của việc sử dụng chỉ là một công cụ.

+4

Nhược điểm: Cần đọc tệp WHOLE và gán EACH LINE cho các biến awk -> Điều này có thể khá là CPU và IO. –

+1

Vâng, giải pháp rất đơn giản, nhưng không hiệu quả. Một giải pháp hiệu quả sẽ mở tệp, tìm cách kết thúc và quét lùi. –

15

Cách sử dụng grep để lọc ra các dòng trống trước?

$ cat rjh 
1 
2 
3 


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

hoặc thay vì 'cat rjh | grep "." | tail -1 ', sử dụng' grep. rjh | tail -1 ' – amertune

+0

'grep". "' kỹ thuật là rất hữu ích, nhờ – Debugger

+0

ai đó có thể giải thích grep "." phần ? –

28

Sử dụng tac, vì vậy bạn không cần phải đọc toàn bộ file:

tac FILE |egrep -m 1 . 
+3

Trên OS X, đó là 'gtac' – vault

+0

@vault không có trên Sierra, 2016. – gsamaras

+0

@gsamaras thử vuốt từ phải sang trái trên thanh cảm ứng – vault

2

nếu bạn muốn bỏ qua bất kỳ khoảng trắng, ví dụ, không gian/tab ở cuối dòng, không chỉ dòng trống

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

Thay vì tac bạn có thể sử dụng tail -r nếu có.

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

Phiên bản nào của 'đuôi (1)' có tùy chọn '-r'? Người trong lõi của GNU không có nó, cf. http://debbugs.gnu.org/18808 –

1

Nếu tail -r là không có sẵn và bạn không có egrep, sau đây hoạt động độc đáo:

tac $FILE | grep -m 1 '.'

Như bạn có thể thấy, đó là một sự kết hợp của hai trong số những câu trả lời trước.