awk: сопоставить регулярное выражение или оператор двух переменных оболочки - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь использовать разные вещи с awk.
Во-первых, использование некоторых переменных оболочки, которые здесь показывают, как их использовать.
Во-вторых, как использовать переменную оболочки для сопоставления с шаблоном, который здесь указывает на использование оператора ~.
Наконец, я хочу использовать какой-то или оператор для сопоставления двух переменных оболочки.

Собираем все вместе в foo.sh:

#!/bin/bash

START_TEXT="My start text"
END_TEXT="My end text"

awk -v start=$START_TEXT -v end=$END_TEXT '$0 ~ start || $0 ~ end { print $2 }' myfile

Который не запускается:

$ ./foo.sh 
awk: fatal: cannot open file `text' for reading (No such file or directory)

Так что я думаю, что оператор OR (||) плохо работает с оператором регулярных выражений ~.
Я догадывался, что мне может понадобиться сделать операцию ИЛИ внутри регулярного выражения.
Итак, я попробовал эти два:

awk -v start=$START_TEXT -v end=$END_TEXT '$0~/start|end/ { print $2 }' myfile
awk -v start=$START_TEXT -v end=$END_TEXT '$0~start|end { print $2 }' myfile

С таким же неудавшимся результатом.
И даже эта вещь терпит неудачу ...

awk -v start=$START_TEXT '$0~start { print $2 }' myfile

Так что я делаю что-то действительно не так ...
Любые намеки, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Вы можете сделать regex OR так:

awk -v start="$START_TEXT" -v end="$END_TEXT" '$0~ start "|" end { print $2 }' myfile

awk знает, что параметр, переданный оператору ~, является регулярным выражением, поэтому мы можем просто обработать его, вставив оператор | или между двумя строками.

Также есть еще один способ передачи переменных в awk, например:

awk '$0~ start "|" end { print $2 }' start="$START_TEXT" end="$END_TEXT" myfile

Это увеличит краткость. Но поскольку он менее интуитивно понятен, используйте его с осторожностью.

0 голосов
/ 09 марта 2019

Что ж, похоже, @jxc указал мою проблему в комментариях: переменные оболочки должны быть заключены в кавычки.

awk -v start="$START_TEXT" -v end="$END_TEXT" '$0~start || $0~end { print $2 }' myfile

Это заставило его работать!

...