Как распечатать соответствующий шаблон регулярных выражений с помощью 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 ответов:
Это самое основное
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
,subst
RSTART
и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
awk
match()
функция с тремя аргументами существует только в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