Якщо я використовую cat -n text.txt
для автоматичної нумерації рядків, то як я можу використовувати команду для показу лише певних пронумерованих рядків.
tail
+ head
також може це зробити, як можеawk
Якщо я використовую cat -n text.txt
для автоматичної нумерації рядків, то як я можу використовувати команду для показу лише певних пронумерованих рядків.
tail
+ head
також може це зробити, як можеawk
Відповіді:
Використовуйте 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
Залежно від цілей мені подобається голова чи греп
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
хоча
cat
не може робити те, що хоче ОП
Як вам показали інші, користуватися не потрібно 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