Как распечатать все строки после совпадения до конца файла?

Входной файл1:

dog 123 4335 cat 13123 23424 deer 2131 213132 bear 2313 21313 

Я даю совпадение шаблону из other file (например, dog 123 4335 из файла2).

Я сопоставляю рисунок линии с dog 123 4335 и после печати всех строк без строки соответствия мой вывод:

 cat 13123 23424 deer 2131 213132 bear 2313 21313 

Если использовать только адрес строки, используйте только шаблон, например 1s как сопоставлять и печатать строки?

11 Solutions collect form web for “Как распечатать все строки после совпадения до конца файла?”

Предполагая, что вы хотите сопоставить всю строку с вашим шаблоном, с помощью GNU sed , это работает:

 sed -n '/^dog 123 4335$/ { s///; :a; n; p; ba; }' infile 

Стандартный эквивалент:

 sed -ne '/^dog 123 4335$/{s///; :a' -e 'n;p;ba' -e '}' infile 

Со следующим вводом ( infile ):

 cat 13123 23424 deer 2131 213132 bear 2313 21313 dog 123 4335 cat 13123 23424 deer 2131 213132 bear 2313 21313 

Выход:

 cat 13123 23424 deer 2131 213132 bear 2313 21313 

Объяснение:

  • /^dog 123 4335$/ ищет нужный шаблон.
  • s/// освобождает пространство шаблонов, предполагая, что вы не хотите, чтобы шаблон включался в выход.
  • :a; n; p; ba; представляет собой цикл, который извлекает новую строку из ввода ( n ), печатает ее ( p ) и отбрасывает обратно на метку a :a; ...; ba; :a; ...; ba; ,

Обновить

Вот ответ, который приближается к вашим потребностям, то есть шаблон в файле2, grepping из файла1:

 tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1 

Вложенные grep и cut находят первую строку, содержащую шаблон из файла2, этот номер строки плюс один передается на хвост, плюс один – для пропуска строки с шаблоном.

Обратите внимание, что не все версии хвоста поддерживают плюс-нотацию.

Если у вас есть достаточно короткий файл, grep может работать:

 grep -A5000 -m1 -e 'dog 123 4335' animals.txt 

5000 – это только моя догадка «разумно короткая», так как grep находит первое совпадение и выводит его вместе со следующими 5000 строками (у файла не должно быть такого количества). Если вам не нужен сам матч, вам нужно его отключить, например

 grep -A5000 -m1 -e 'dog 123 4335' animals.txt | tail -n+2 


Если вам не нужен первый, но последний матч в качестве разделителя, вы можете использовать это:

 tac animals.txt | sed -e '/dog 123 4335/q' | tac 

Эта строка считывает animals.txt в обратном порядке строк и выходов до линии и включает линию с dog 123 4335 а затем снова вспять, чтобы восстановить правильный порядок.

Опять же, если вам не нужен матч в результате, добавьте хвост. (Вы также можете усложнить выражение sed, чтобы отбросить его буфер до выхода.)

На практике я, вероятно, использовал бы ответ Aet3miirah большую часть времени, и ответ alexey замечателен, когда вы хотите перемещаться по линиям (также он также работает с less ). OTOH, мне очень нравится другой подход (который является ответом обратного ответа Жиля :

 sed -n '/dog 123 4335/,$p' 

Когда вызывается с флагом -n , sed по умолчанию не печатает строки, которые он обрабатывает. Затем мы используем 2-адресную форму, в которой говорится, чтобы применить команду из соответствия линии /dog 123 4335/ до конца файла (представленной $ ). Эта команда представляет собой p , которая печатает текущую строку. Таким образом, это означает «распечатать все строки из одного совпадающего /dog 123 4335/ до конца».

$ more +/"dog 123 4335" file1

 sed -e '1,/dog 123 4335/d' file1 

Если вам нужно прочитать шаблон из файла, замените его на команду sed. Если файл содержит шаблон sed:

 sed -e "1,/$(cat file2)/d" file1 

Если файл содержит литеральную строку для поиска, укажите все специальные символы. Я предполагаю, что файл содержит одну строку.

 sed -e "1,/$(sed 's/[][\\\/^$.*]/\\&/g' file2)/d" file1 

Если вы хотите, чтобы совпадение представляло собой целую строку, а не только подстроку, заверните шаблон в ^…$ .

 sed -e "1,/^$(sed 's/[][\\\/^$.*]/\\&/g' file2)\$/d" file1 

С awk :

 awk 'BEGIN {getline pattern < "other file"} NR == 1, $0 ~ pattern {next}; {print}' < "input file" 

Если вход представляет собой обычный файл:

С GNU grep :

 { grep -xFm1 'dog 123 4335' >&2 cat; } <infile 2>/dev/null >outfile 

С sed :

 { sed -n '/^dog 123 4335$/q' cat; } <infile >outfile 

GNU grep называемый w / the -m выйдет из ввода в матче – и он оставит свой (lseekable) вход fd сразу после точки, в которой он нашел свое последнее совпадение. Поэтому вызов grep w / -m1 находит первое вхождение шаблона в файл и оставляет смещение ввода точно в нужном месте, чтобы cat записывала все, что соответствовало первому совпадению шаблона в файле на stdout.

Даже без GNU grep вы можете сделать то же самое с совместимым с POSIX sed – когда sed q uits указано, что он оставляет свое входное смещение прямо там, где оно есть. Однако GNU sed не соответствует стандартам, и поэтому выше, скорее всего, не будет работать с GNU sed если вы не назовете его своим переключателем -u .

Один из способов использования awk:

 awk 'NR==FNR{a[$0];next}f;($0 in a){f=1}' file2 file1 

где file2 содержит ваши шаблоны поиска. Во-первых, все содержимое файла2 хранится в массиве «a». Когда файл1 обрабатывается, каждая строка проверяется на массив и печатается только в том случае, если его нет.

Мой ответ на вопрос в теме, без сохранения шаблона во втором файле. Вот мой тестовый файл:

 $ cat animals.txt cat 13123 23424 deer 2131 213132 bear 2313 21313 dog 123 4335 cat 13123 23424 deer 2131 213132 bear 2313 21313 

GNU sed:

  $ sed '0,/^dog 123 4335$/d' animals.txt cat 13123 23424 deer 2131 213132 bear 2313 21313 

Perl:

 $ perl -ne 'print unless 1.../^dog 123 4335$/' animals.txt cat 13123 23424 deer 2131 213132 bear 2313 21313 

Вариант Perl с шаблоном в файле:

 $ cat pattern.txt dog 123 4335 $ perl -ne 'BEGIN{chomp($p=(<STDIN>)[0])};print unless 1../$p/;' animals.txt < pattern.txt cat 13123 23424 deer 2131 213132 bear 2313 21313 

Как распечатать все строки после совпадения до конца файла?

Другой способ выразить это «как удалить все строки с 1-го до матча (в том числе)», и это может быть sed -written как:

 sed -e '1,/MATCH PATTERN/d' 

Поскольку awk явно не разрешено, вот мое предложение, предполагающее, что «кот» – это матч.

 awk '$0 ~ /cat/ { vart = NR }{ arr[NR]=$0 } END { for (i = vart; i<=NR ; i++) print arr[i] }' animals.txt 
  • Извлечь ключевое слово из строки
  • Как извлечь число из строки ниже, которая является выводом команды?
  • awk или sed для соответствия регулярному выражению в определенной строке, выход true, если успех, false, иначе
  • sed восклицательные знаки
  • Заменяйте каждую вкладку ТОЛЬКО в начале каждой строки пробелами
  • Объединить строки по первому столбцу с помощью awk или sed
  • печатать только строки, у которых есть последняя непустая ячейка, которая начинается со слова «Failed» в CSV-файле в Linux
  • Используйте SED или AWK для перемещения строки в новый столбец и строку
  • Удаление строк, содержащих указанную строку в разных файлах
  • sed regex не работает
  • вырезать первый и последний элемент в CSV
  • Interesting Posts

    В Synaptic (Debian Wheezy) как реагировать на сообщение «… сломанный пакет …»?

    Почему мое правило udev не работает?

    Идентификатор группы процессов Shell = идентификатор группы процессов переднего плана?

    Почему некоторые команды регулярных выражений имеют противоположные интуиции '\' с различными символами?

    Как обрабатывать действие Eject от Nautilus в файловой системе FUSE?

    резервная база данных MSSQL на локальный диск клиента по сети

    Изменяют ли регуляторы Linux cpufreq временно sysfs’s scaling_max_freq?

    Установка Kali на USB-накопителе – НЕ Live USB или раздел Persistence

    Linux Mint & LIFEREA rss reader

    Замедление процессора при его нагревании

    Получите время пользователя и ядра для текущего процесса?

    Возможно ли иметь комментарии в многострочных командах в рыбе?

    Инструмент, для которого может быть запрограммирован запрос на запрос подтверждения

    Контрольный код выхода в tmux

    как я могу проверить TRIM?

    Linux и Unix - лучшая ОС в мире.