Jeśli mogę użyć cat -n text.txt
, aby automatycznie numeruje linie, jak mogę następnie użyć polecenia, aby pokazać tylko niektóre ponumerowanych linii.
tail
+ head
Można również to zrobić, jak możnaawk
Jeśli mogę użyć cat -n text.txt
, aby automatycznie numeruje linie, jak mogę następnie użyć polecenia, aby pokazać tylko niektóre ponumerowanych linii.
tail
+ head
Można również to zrobić, jak możnaawk
Odpowiedzi:
Posługiwać się sed
Stosowanie
$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Aby wydrukować jedną linię (5)
$ sed -n 5p file
Line 5
Aby wydrukować wiele linii (5 i 8)
$ sed -n -e 5p -e 8p file
Line 5
Line 8
Aby wydrukować określony zakres (5–8)
$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8
Aby wydrukować zakres z inną określoną linią (5-8 i 10)
$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
Jednym ze sposobów na to jest użycie sed
:
cat -n text.txt | sed '11d'
gdzie 11 to numer linii, którą chcesz usunąć.
Lub usunąć wszystkie oprócz 11:
cat -n text.txt | sed '11!d'
Możliwe są również zakresy:
cat -n text.txt | sed '9,12!d'
I cat -n
nawet nie jest potrzebny:
sed '9,12!d' text.txt
W zależności od celów lubię głowę lub grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
zwróci linie od 41 do 50.
lub
cat /var/log/syslog -n | grep " 50" -b10 -a10
pokaże linie od 40 do 60. Problem z metodą grep polega na tym, że musisz używać konta do uzupełniania numerów linii (zauważ spację)
Oba są bardzo przydatne do analizowania plików dziennika.
cat
jednak
cat
nie może robić tego, co chce OP
Jak pokazali ci inni, nie ma potrzeby używania cat -n
. Inne programy zrobią to za Ciebie. Jeśli jednak naprawdę musisz przeanalizować dane wyjściowe cat -n
i wyświetlić tylko określone wiersze (na przykład 4-8, 12 i 42), możesz:
$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
4 Line 4
5 Line 5
6 Line 6
7 Line 7
8 Line 8
12 Line 12
42 Line 42
W awk
, $1
to pierwszy obszar, tak więc polecenie drukuje linie, których pierwsze pola są i) od 4 do 8 (włącznie) lub ii), iii) 12 lub 42.
Jeśli chcesz również usunąć pole dodane przez, cat -n
aby uzyskać oryginalne wiersze z pliku, możesz:
$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42