Grep текст, соответствующий шаблону

Я искал команду, которая будет печатать выбранную часть строки, которая соответствует условиям. Например, моя текстовая строка выглядит так:

p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X 

Я хочу напечатать те значения, которые имеют Y В этом примере ожидаемым результатом является p2,p6 .

6 Solutions collect form web for “Grep текст, соответствующий шаблону”

Использование регулярного выражения P erl в grep :

 grep -Po '..(?==Y)' <file 

Результат:

 p2 p6 

Попробуй это:

 echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g' 

Вывод:

 p2,p6 

awk может читать записи на основе разделителя регулярных выражений по вашему выбору. например '[|\n]'
Он также может разбивать записи на поля по вашему выбору. например. '='
Тернарный оператор (condition)?: предотвращает ведущую запятую.

 awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }' 

вывод:

 p2,p6 

Если необходима конечная новая строка, ее можно добавить в раздел END{} . Чтобы предотвратить вывод новой строки при отсутствии совпадений, Сепаратор выходных записей ( ORS ) может быть первоначально установлен на none , а затем установить на \n если совпадение найдено.

 awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}' 

Как насчет:

 tr '|' '\n' | sed -n 's/=Y$//p' 

простой awk

 awk -F\| '{for (i=1 ; i<= NF; i++) if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}' 

где

  • -F\| использование | как разделитель
  • {for (i=1 ; i<= NF; i++) сканирование по шаблону
  • if ( $i ~/Y/ ) если найдено
  • { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;} { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;} разделите его и распечатайте

вывод

 in 3 : p2 in 11 : p6 

используйте printf "%s\n",A[1] чтобы пропустить номер шаблона

 perl -nE 'say join(",",/(\w+)=Y/g)' 
  • Регулярные команды и команды с командой sed
  • `pwd`, но опустить первые n каталогов
  • Почему вывод этой команды вставки разделяется на отдельные строки с помощью отступов?
  • распечатать определенную строку из нескольких файлов
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Застрял в разделении символов на строки в моем подходе. Нашел рабочий подход, но не может его понять
  • Как преобразовать данные с разделителями табуляции в данные с разделителями-запятыми?
  • Как заменить этот шаблон на новую строку внутри?
  • Bash - Конвертировать символ escape-символа в BBCode
  • Как сопоставить шаблон и заменить только часть шаблона?
  • Заменить строку последовательным индексом
  • Interesting Posts

    cpufreqd не контролирует температуру плюс показывает отсутствие выхода

    Минимизировать PHP.CGI.Argument.Injection и дальнейшее упрощение веб-сервера Centos 6.4

    Как разделить FHS только для чтения и читать / писать каталоги на двух дисках с помощью Linux / systemd, без разбиения диска raed / write?

    Расширение параметра в grep

    как вывести вывод поиска в другой поиск

    Что делает опция -c sg?

    Что означает двоеточие (':') в синтаксисе разрешения переменной bash?

    Могу ли я использовать время A | B для измерения времени, затраченного на запуск A | B?

    Из-за сломанного монитора мне нужно настроить только правую половину экрана

    Как я могу установить или работать с ядром Ubuntu? Есть ли другие ядра?

    Как выйти из установки Fedora?

    SCP между двумя разными серверами с двумя разными портами

    Какой файл PHP ini

    Я хочу найти дубликаты в файле и добавить символ в конец строки в первом совпадении

    Что значит? * Означает в команде оболочки?

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