Я нашел несколько способов передать внешние переменные оболочки в awk
сценарий, но я запутался в '
и "
.
Сначала я попытался с помощью сценария оболочки:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Тогда попробовал awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Почему разница?
Наконец я попробовал это:
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
Я запутался в этом.
/var/
. Вместо этого используйте тильду:awk -v var="$var" '$0 ~ var'
Ответы:
Использование
-v
(Лучший способ, самый портативный)Используйте
-v
опцию: (PS используйте пробел после-v
или он будет менее переносимым. Например,awk -v var=
нетawk -vvar=
)Это должно быть совместимо с большинством
awk
, и переменная также доступна вBEGIN
блоке:Если у вас есть несколько переменных:
Предупреждение . Как пишет Эд Мортон, escape-последовательности будут интерпретироваться, поэтому они
\t
становятся реальными,tab
а не\t
если это то, что вы ищете. Может быть решен с помощьюENVIRON[]
или доступ к нему черезARGV[]
PS Если вам нравятся три вертикальные черты в качестве разделителя
|||
, от них нельзя убежать, поэтому используйте-F"[|][|][|]"
Переменная после блока кода
Здесь мы получаем переменную после
awk
кода. Это будет работать нормально, если вам не нужна переменная вBEGIN
блоке:awk '{print a,b,$0}' a="$var1" b="$var2" file
FS
для каждого файла.awk 'some code' FS=',' file1.txt FS=';' file2.ext
BEGIN
блока:echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Здесь строка
Переменная также может быть добавлена к
awk
использованию здесь-строки из поддерживаемых ими оболочек (включая Bash):Это так же, как:
PS это обрабатывает переменную как файл ввода.
ENVIRON
входКак пишет TrueY, вы можете использовать
ENVIRON
для печати переменных среды . Задав переменную перед запуском AWK, вы можете распечатать ее следующим образом:ARGV
входКак пишет Стивен Пенни, вы можете использовать
ARGV
данные в awk:Чтобы получить данные в самом коде, а не только НАЧАТЬ:
Переменная в коде: использовать с осторожностью
Вы можете использовать переменную в
awk
коде, но она грязная и трудная для чтения, и, какCharles Duffy
отмечается, эта версия также может стать жертвой внедрения кода. Если кто-то добавляет в переменную плохой материал, он будет выполнен как частьawk
кода.Это работает путем извлечения переменной в коде, поэтому она становится ее частью.
Если вы хотите создать
awk
динамическое изменение с использованием переменных, вы можете сделать это таким образом, но НЕ используйте его для обычных переменных.Вот пример внедрения кода:
Вы можете добавить много команд
awk
таким образом. Даже сбой с недействительными командами.Дополнительная информация:
Использование двойной кавычки
Всегда полезно
"$variable"
заключить в кавычки переменную. Если нет, несколько строк будут добавлены в виде одной длинной строки.
Пример:
Другие ошибки, которые вы можете получить без двойной кавычки:
И с одинарной кавычкой, это не расширяет значение переменной:
Больше информации о AWK и переменных
Прочитайте этот FAQ .
источник
awk -v repo="$1" -v tag="$2" 'BEGIN {print "repo="repo,"tag="tag}'
. Он увидит, печатает ли она переменную. Оставьте свой вопрос, если не можете разобраться.Кажется, что старый добрый
ENVIRON
AWKвстроенный хеш вообще не упоминается. Пример его использования:источник
-v
не работает, если значение содержит обратную косую черту.awk -v x='\c\d' ...
то он будет использоваться правильно. Но когдаx
печатается, awk выдает известноеawk: warning: escape sequence '\c' treated as plain 'c'
сообщение об ошибке ... Спасибо!-v
был разработан, чтобы вы могли использовать\t
переменную и сопоставить ее, например, с литеральной вкладкой в данных. Если это не то поведение, которое вы хотите, то вы не используете,-v
вы используетеARGV[]
илиENVIRON[]
.Используйте любой из них в зависимости от того, как вы хотите, чтобы в переменных оболочки обрабатывались обратные слеши (
avar
это переменная awk,svar
это переменная оболочки):Смотрите http://cfajohnson.com/shell/cus-faq-2.html#Q24 для деталей и других опций. Первый метод, описанный выше, почти всегда является вашим лучшим вариантом и имеет наиболее очевидную семантику.
источник
Вы можете передать параметр командной строки
-v
с помощью переменной name (v
) и значения (=
) переменной среды ("${v}"
):Или чтобы было понятнее (с гораздо меньшим количеством
v
с):источник
Вы можете использовать ARGV:
Обратите внимание, что если вы собираетесь продолжить в теле, вам нужно настроить ARGC:
источник
Я только что изменил ответ @ Jotne на "для цикла".
источник
-v
опцию Awk, которая уже упоминалась во многих существующих ответах. Если вы хотите показать, как запустить Awk в цикле, это действительно другой вопрос.Мне пришлось вставить дату в начале строки файла журнала, и это сделано, как показано ниже:
Это можно перенаправить в другой файл, чтобы сохранить
источник