Как распечатать соответствующий шаблон регулярных выражений с помощью awk?


используя awk, мне нужно найти слово в файле, который соответствует шаблону регулярного выражения.

Я только хотите напечатать слово, соответствующее шаблону.

так, если в строке, у меня есть:

xxx yyy zzz

и рисунком:

/yyy/

Я хочу только:

yyy

изменить: спасибо Куруми мне удалось написать что-то вроде этого:

awk '{
        for(i=1; i<=NF; i++) {
                tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
                if(tmp) {
                        print $i
                }
        }
}' 

и это то, что мне нужно :) спасибо много!

6 73

6 ответов:

Это самое основное

awk '/pattern/{ print  }' file

задать awk искать pattern используя //, затем выведите строку, которая по умолчанию называется записью, обозначенной $0. По крайней мере, прочитайте документация.

если вы только хотите, чтобы распечатать соответствующее слово.

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file

похоже, вы пытаетесь подражать GNU grep -o поведение. Это сделает это, если вы хотите только первый матч на каждой строке:

awk 'match(, /regex/) {
    print substr(, RSTART, RLENGTH)
}
' file

вот пример:

% awk 'match(, /a.t/) {
    print substr(, RSTART, RLENGTH)
}
' /usr/share/dict/words | head
act
act
act
act
aft
ant
apt
art
art
art

для остальной части вашей домашней работы, вам необходимо посмотреть, что каждый из match,substRSTART и RLENGTH у в awk руководство.

после этого вы можете расширить это, чтобы иметь дело с несколькими матчами на одной линии. Я не могу сделать все ваш домашнее задание для вас :-)

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

{ if (match(,/your regexp/,m)) print m[0] }

match (string, regexp [, array]) Если массив присутствует, он очищается, и тогда нулевой элемент массива устанавливается на всю часть строка соответствует регулярному выражению. Если регулярное выражение содержит скобки, то целочисленные индексированные элементы массива будут содержать часть строку, соответствующие скобки подвыражения. http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

если Perl является опцией, вы можете попробовать это:

perl -lne 'print  if /(regex)/' file

чтобы реализовать сопоставление без учета регистра, добавьте i модификатор

perl -lne 'print  if /(regex)/i' file

чтобы напечатать все после матча:

perl -lne 'if ($found){print} else{if (/regex(.*)/){print ; $found++}}' textfile

печатать матч и все после матча:

perl -lne 'if ($found){print} else{if (/(regex.*)/){print ; $found++}}' textfile

если вас интересует только последняя строка ввода, и вы ожидаете найти только одно совпадение (например, часть сводной строки команды оболочки), вы также можете попробовать этот очень компактный код, принятый из как печатать совпадения регулярных выражений с помощью 'awk'?:

$ echo "xxx yyy zzz" | awk '{match(,"yyy",a)}END{print a[0]}'
yyy

или более сложная версия с частичным результатом:

$ echo "xxx=a yyy=b zzz=c" | awk '{match(,"yyy=([^ ]+)",a)}END{print a[1]}'
b

внимание: the awkmatch() функция с тремя аргументами существует только в gawk, а не в mawk

вот еще одно хорошее решение с помощью 'назад' регулярное выражение на grep вместо awk. Это решение имеет более низкие требования к вашей установке:

$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b

использование sed также может быть элегантным в этой ситуации. Пример (заменить строку с соответствующей группой " yyy " из строки):

$ cat testfile
xxx yyy zzz
yyy xxx zzz
$ cat testfile | sed -r 's#^.*(yyy).*$##g'
yyy
yyy

соответствующая страница руководства: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions