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.

Geckono1
źródło
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
tachomi
źródło
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
phk
źródło
9

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

awk 'NR==1' file.txt

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

KUBball3
źródło
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.

Coteyr
źródło
Ż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
terdon
źródło