W przypadku polecenia „cat” w systemie Linux, w jaki sposób wyświetlać tylko niektóre wiersze według liczb


59

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.


1
Co masz na myśli mówiąc „pokaż tylko niektóre linie numerowane”, czy możesz podać oczekiwany wynik?
tachomi

1
Prawdopodobnie będzie na to milion sposobów. tail+ headMożna również to zrobić, jak możnaawk
Bratchley

Odpowiedzi:


120

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

27

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 -nnawet nie jest potrzebny:

sed '9,12!d' text.txt

9

Możesz użyć awk prosto w górę.

awk 'NR==1' file.txt

zastępując „1” żądanym numerem linii.


1
To miliony mil najlepsza odpowiedź tutaj i zasługuje na znacznie więcej miłości niż ma.
Wren

8

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.


Żaden przykład nie wymaga catjednak
roaima,

1
no tak ... ale .... ale ... ..... Są lepsze sposoby. Pytanie dotyczyło używania kota, więc go użyłem.
coteyr

catnie może robić tego, co chce OP
roaima,

2

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 -ni 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, $1to 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 -naby 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.