Linux - "grep" от определенных строк до конца файла

Linux - "grep" от определенных строк до конца файла

У меня есть текстовый файл, похожий на этот:

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)(Эта функция работает и в других awks, но 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

Связанный контент