У меня есть текстовый файл, похожий на этот:
line 1
line 2A
line 3
line 4A
line 5
Я хочу выполнить «grep» от «строки 2A» до конца файла, что-то вроде этого
cat file.txt|some_grep "line 2A"
Также я хочу выполнить «grep» от «строки 2A» до следующей строки, содержащей «A», что-то вроде этого
cat file.txt| some_grep "A"
Я хочу, чтобы это было распечатано:
line 2A
line 3
line 4A
Какая команда может мне помочь этого добиться?
решение1
(расширено из комментария)
awk
имеет возможность выбирать «диапазоны» линий, которые идеально соответствуют этой потребности, какописан в руководстве GNU-awk (gawk)(Эта функция работает и в других awk
s, но gawk
ссылку на руководство легко сделать.)
awk '/line 2A/,0'
выводит строки, начиная с первой совпадающей line 2A
и продолжая до конца ввода, поскольку 0
это условие никогда не выполняется.
awk '/line 2A/,/A/&&!/line 2A/'
начинает печать со строки, которая совпадает, line 2A
и останавливается после строки, которая совпадает A
, но НЕ совпадает line 2A
(и, следовательно, не может быть той же строкой, что и начальная строка). Она начнетсяснованапоследующий line 2A
и так далее; если вы хотите предотвратить это, есть немного более сложные способы сделать это.
Если линии остановки всегда содержат какой-либо символ, отличный от 2
предшествующего, то A
это можно упростить до awk '/line 2A/,/[^2]A/'
того, что останавливается после строки, которая соответствует любому символу, отличному от 2, за которым следует A. Вам может понадобиться вариация этого, например, чтобы останавливаться на любой однозначной цифре A, отличной от 2A, но не на других As, таких как WHAT
; для этого условием остановки может быть ,/line [013-9]A/
.
решение2
Я хочу выполнить команду grep от «строки 2A» до конца файла:
sed -n '/2A/,$p'
- -n : подавить
sed
вывод по умолчанию - /2A/ : выходные строки из первой, содержащей «2A»
- $ : в конец файла
Я хочу выполнить команду grep от строки 2A до следующей строки, содержащей «A»:
sed -n '/2A/,/A/p'
- /A/ : вывод до тех пор, пока строка не будет содержать «A»
Я хочу выполнить команду grep от первой строки, содержащей «A», до следующей:
printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"
$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5
$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A
$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A
решение3
Я думаю, что лучший способ — использовать grep
в сочетании с cut
и tail
. Сначала используйте grep, чтобы получить строку, на которой находится искомая строка ( -n
для вывода номера строки; -m 1
для остановки поиска после первого совпадения):
grep -n -m 1 "somestring" filename.txt
Это выводит номер строки и саму строку. Чтобы вырезать строку, мы используем cut ( -f1
: вывести первое поле; -d:
использовать ":" в качестве разделителя):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
Далее мы используем вывод этой команды как параметр в tail. Обычно tail печатает последние k строк, но используя -n +k
, мы заставляем tail печатать со строки k и далее. Общая команда:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Для вывода строк до somestring
используйте head
вместо tail
и -n -#
вместо -n +#
. Вы также можете объединить оба, чтобы получить строки от одной строки до другой.
решение4
Попробуйте использовать код ниже -
sed -n '6,$p' infile