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