Как получить шаблон регулярного выражения с помощью 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
и это то, что мне нужно:) Большое спасибо!
Ответы
Ответ 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