Як за допомогою команди "cat" Linux я показую лише певні рядки за номером


59

Якщо я використовую cat -n text.txtдля автоматичної нумерації рядків, то як я можу використовувати команду для показу лише певних пронумерованих рядків.


1
Що ви маєте на увазі під "показувати лише певні пронумеровані рядки", чи можете ви поставити очікуваний результат?
tachomi

1
Можливо, буде мільйон способів це зробити. tail+ headтакож може це зробити, як можеawk
Братчлі

Відповіді:


120

Використовуйте sed

Використання

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

Роздрукувати один рядок (5)

$ sed -n 5p file
Line 5

Друк декількох рядків (5 і 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

Роздрукувати певний діапазон (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

Роздрукувати діапазон за допомогою іншого певного рядка (5 - 8 та 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10

27

Один із способів зробити це за допомогою sed:

cat -n text.txt | sed '11d'

де 11 - номер рядка, який потрібно видалити.

Або видалити всі, крім 11:

cat -n text.txt | sed '11!d'

Можливі також діапазони:

cat -n text.txt | sed '9,12!d'

І cat -nнавіть не потрібно:

sed '9,12!d' text.txt

9

Ви можете використовувати awk прямо вгору.

awk 'NR==1' file.txt

замінивши "1" на потрібний номер рядка.


1
Це на мільйон миль найкраща відповідь тут і заслуговує на набагато більше любові, ніж у нього.
Врен

8

Залежно від цілей мені подобається голова чи греп

cat /var/log/syslog -n | head -n 50 | tail -n 10

поверне рядки 41 до 50.

або

cat /var/log/syslog -n | grep " 50" -b10 -a10

покаже рядки від 40 до 60. Проблема методу grep полягає в тому, що вам потрібно використовувати рахунок для прокладки номерів рядків (зауважте пробіл)

Обидва дуже зручні для розбору файлів журналів.


Ні приклад потрібен , catхоча
roaima

1
ну так ... але .... але ... ..... Є кращі способи. Хоча питання про використання кота, тому я його використав.
coteyr

catне може робити те, що хоче ОП
roaima

2

Як вам показали інші, користуватися не потрібно cat -n. Інші програми зроблять це за вас. Якщо, однак, вам дійсно потрібно проаналізувати результат cat -nі показати лише конкретні рядки (наприклад, 4-8, 12 та 42), ви можете зробити:

$ 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

В awk, $1це перше поле, тому ця команда друкує всі рядки, першими полями яких є i) від 4 до 8 (включно) або ii) 12 або iii) 42.

Якщо ви також хочете видалити додане поле, cat -nщоб отримати оригінальні рядки з файлу, ви можете зробити:

$ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.