С помощью команды Linux «cat», как показать только определенные строки по номеру

59

Если я использую cat -n text.txtдля автоматической нумерации строк, как я тогда использую команду, чтобы показать только определенные пронумерованные строки.

Geckono1
источник
1
Что вы подразумеваете под «показывать только определенные пронумерованные строки», можете ли вы поставить ожидаемый результат?
tachomi
1
Вероятно, будет миллион способов сделать это. tail+ headтакже может сделать это, как можетawk
Bratchley

Ответы:

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
tachomi
источник
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
PHK
источник
9

Вы можете использовать awk прямо вверх.

awk 'NR==1' file.txt

заменив '1' на нужный номер строки.

KUBball3
источник
1
Это на миллион миль лучший ответ здесь и заслуживает гораздо больше любви, чем он имеет.
Рен
8

В зависимости от целей мне нравится голова или grep

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 заключается в том, что вы должны использовать учетную запись для заполнения номеров строк (обратите внимание на пробел)

Оба довольно удобны для анализа файлов журнала.

coteyr
источник
catХотя ни один пример не нужен
roaima
1
ну да ... но .... но ... ..... есть лучшие способы. Вопрос об использовании кошки, хотя, поэтому я использовал его.
Котейр
catне может делать то, что хочет ОП
Ройма
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

In 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
Тердон
источник