Имея следующее в одной из моих функций оболочки:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
, Так что, когда называется _process $arg
, $arg
получает прошло , как $1
и используется в качестве шаблона поиска. Это работает так, потому что оболочка расширяется $1
вместо шаблона awk! Также l
может использоваться внутри программы awk, будучи объявленным с помощью -v l="$line"
. Все хорошо.
Можно ли таким же образом задать шаблон для поиска в качестве переменной?
Следующее не сработает,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
, поскольку awk не будет интерпретироваться /search/
как переменная, а будет буквально.
if (p) ...
$0 ~ pattern
, и он не работает, однако с/'"$1"'/
ним работает !? : O$line
извлекается, шаблон поиска делается на выходеwhois $line
,$line
исходя из файла в DO WHILE блока.$line
- сделайте это в своем вопросе для правильного форматирования.Имеет проблему с
awk
расширением escape-последовательностей ANSI C (например,\n
для новой строки,\f
для подачи формы,\\
для обратной косой черты и т. Д.)$1
. Таким образом, это становится проблемой, если$1
содержит символы обратной косой черты, которые являются общими в регулярных выражениях (в GNUawk
4.2 или выше значения, начинающиеся с@/
и заканчивающиеся/
, также являются проблемой ). Другой подход, который не страдает от этой проблемы, это написать:Насколько плохо это будет, будет зависеть от
awk
реализации.Все они
awk
работают одинаково для корректных escape-последовательностей:(содержание
$a
передано как есть)(
\\
изменено\
и\b
изменено на символ возврата).источник
\d{3}
для поиска трех цифр, это не сработало бы, как ожидалось, если бы я вас хорошо понял?\d
которого недопустимая escape-последовательность C, это зависит от вашейawk
реализации (запуститьawk -v 'a=\d{3}' 'BEGIN{print a}'
для проверки). Но для\` or
\ b, yes definitely. (BTW, I don't know of any awk implementations that understands
\ d` это означает цифру).\d' treated as plain
d 'd {3}, так что, думаю, у меня возникнет проблема в этом случае?ENVIRON["PATTERN"]
дляPATTERN
переменной среды. Если вы хотите использовать переменную оболочки, вам нужно сначала экспортировать ее (export variable
) или использоватьENV=VALUE awk '...ENVIRON["ENV"]'
синтаксис передачи env-var, как в моем ответе.Попробуйте что-то вроде:
источник
/regex/
с точки зрения поиска шаблона, это может быть хорошим решением. Я попытаюсь.Нет, но вы можете просто вставить шаблон в строку в двойных кавычках, которую передаете в awk:
Обратите внимание, что теперь вы должны избегать двойных кавычек, но это все еще самый простой способ сделать это.
источник
$pattern
содержит пробелы, мой приведенный выше пример будет работать, так как $ 1 защищен двойными кавычками "$ 1", однако не уверен, что произойдет в вашем случае.'
, затем защищает$1
сквозные двойные кавычки, а затем добавляет еще одну строку в одинарных кавычках для второй половины программы awk. Если я правильно понимаю, это должно иметь тот же эффект, что и защита с$1
помощью внешних одинарных кавычек - awk никогда не увидит двойные кавычки, которые вы помещаете вокруг него.$pattern
содержит^/ {system("rm -rf /")};
, то у вас большие проблемы.Вы можете использовать функцию eval, которая разрешает в этом примере переменную nets перед запуском awk.
источник