2011-08-11 14 views
24

Mam plik, który zawiera następujące trzy ostatnie linie. Chcę pobrać przedostatnią linię, tj. 100.000;8438; 06:46:12.Bash - jak odczytać drugą do ostatniej linii w pliku?

. 
. 
. 
99.900; 8423; 06:44:41 
100.000;8438; 06:46:12 
Number of patterns: 8438 

Nie znam numeru wiersza. Jak mogę go odzyskać za pomocą skryptu powłoki? Z góry dziękuje za twoją pomoc.

Odpowiedz

75

Spróbuj tego:

tail -2 yourfile | head -1 
+1

dzięki !! działało tak, jak chciałem – World

+0

Nie ma za co! – MattH

+3

Serdecznie zapraszamy! – MattH

1

Użyj tego

tail -2 <filename> | head -1 
2

ed i sed może to zrobić również.

str=' 
99.900; 8423; 06:44:41 
100.000;8438; 06:46:12 
Number of patterns: 8438 
' 

printf '%s' "$str" | sed -n -e '${x;1!p;};h'      # print last line but one 
printf '%s\n' H '$-1p' q | ed -s <(printf '%s' "$str")   # same 
printf '%s\n' H '$-2,$-1p' q | ed -s <(printf '%s' "$str")  # print last line but two 
0

Aby wyjaśnić, co już zostało powiedziane:

ec2thisandthat | sort -k 5 | grep 2012- | awk '{print $2}' | tail -2 | head -1 

snap-e8317883 
snap-9c7227f7 
snap-5402553f 
snap-3e7b2c55 
snap-246b3c4f 
snap-546a3d3f 
snap-2ad48241 
snap-d00150bb 

powraca

snap-2ad48241 
1

Od: Useful sed one-liners Eric Pementa

# print the next-to-the-last line of a file 
sed -e '$!{h;d;}' -e x    # for 1-line files, print blank line 
sed -e '1{$q;}' -e '$!{h;d;}' -e x # for 1-line files, print the line 
sed -e '1{$d;}' -e '$!{h;d;}' -e x # for 1-line files, print nothing 

Nie trzeba wszystko je, po prostu wybierz jedną.

0

Krótki sed jedno-liner inspirowane https://stackoverflow.com/a/7671772/5287901

sed -n 'x;$p' 

Objaśnienie:

  • -n cichy tryb: dont automatycznie drukować przestrzeń wzór
  • x: wymiana przestrzeń wzór i przestrzeń przechowywania (przytrzymaj teraz przechowuje bieżącą linię, a przestrzeń wzoru poprzednią linia, jeśli występuje)
  • $: na ostatniej linii, p: wydrukuj przestrzeń wzorów (poprzednia linia, która w tym przypadku jest przedostatnią linią).
Powiązane problemy