2010-04-14 9 views

Odpowiedz

19

Można stosować awk:

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

To rozwiązanie ma tę zaletę, że przy użyciu tylko jednego narzędzia.

+4

Minus: wymaga odczytu całego pliku i przypisania KAŻDEJ LINII do zmiennych awk -> Może to być dość intensywne procesor i IO. –

+1

Tak, rozwiązanie jest proste, ale dalekie od wydajności. Skuteczne rozwiązanie otwiera plik, szuka do końca i skanuje do tyłu. –

15

Co zrobić, jeśli najpierw odfiltrować puste linie?

$ cat rjh 
1 
2 
3 


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

lub zamiast "cat rjh | grep "." | ogon -1 ', użyj' grep. rjh | tail -1 ' – amertune

+0

'grep". "' technic jest bardzo przydatny, dzięki – Debugger

+0

ktoś mógłby wyjaśnić grep "." część? –

28

użycie tac, więc nie trzeba przeczytać cały plik:

tac FILE |egrep -m 1 . 
+3

Na OS X jest to 'gtac' – vault

+0

@vault nie na Sierra, 2016. – gsamaras

+0

@gsamaras Spróbuj przesuń palcem od prawej do lewej na pasku dotykowym – vault

2

jeśli chcesz pominąć wszelkie spacje, tj obowiązuje/kart na końcu linii, a nie tylko puste linie

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

Zamiast tac można użyć tail -r jeśli są dostępne.

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

Które wersje 'tail (1)' mają opcję '-r'? Ten w GNU coreutils go nie ma, cf. http://debbugs.gnu.org/18808 –

1

Jeśli tail -r nie jest dostępny i nie masz egrep następujący działa ładnie:

tac $FILE | grep -m 1 '.'

Jak widać, jest to kombinacja dwóch poprzednich odpowiedzi.

Powiązane problemy