Подтвердить что ты не робот

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

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

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

Итак, если в строке есть:

xxx yyy zzz

И шаблон:

/yyy/

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

yyy

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

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

и это то, что мне нужно:) Большое спасибо!

4b9b3361

Ответ 1

Это самый простой

awk '/pattern/{ print $0 }' file

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

Если вы хотите распечатать только совпадающее слово.

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

Ответ 2

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

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

Вот пример:

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

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

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

Ответ 3

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

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

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

Ответ 4

Если параметр Perl является опцией, вы можете попробовать следующее:

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

Ответ 5

Если вас интересует только последняя строка ввода, и вы ожидаете найти только одно совпадение (например, часть итоговой строки команды оболочки), вы также можете попробовать этот очень компактный код, принятый из Сопряжение regexp соответствует AWK:

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

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

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

Предупреждение: функция awk match() с тремя аргументами существует только в gawk, а не в mawk

Вот еще одно приятное решение, использующее lookbehind regex в grep вместо awk. Это решение имеет более низкие требования к вашей установке:

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