Получение переменных оболочки в awk
может быть сделано несколькими способами. Некоторые лучше, чем другие. Это должно охватывать большинство из них. Если у вас есть комментарий, пожалуйста, оставьте ниже. v1.5
Использование -v
(Лучший способ, самый портативный)
Используйте -v
опцию: (PS используйте пробел после -v
или он будет менее переносимым. Например, awk -v var=
нет awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Это должно быть совместимо с большинством awk
, и переменная также доступна в BEGIN
блоке:
Если у вас есть несколько переменных:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Предупреждение . Как пишет Эд Мортон, escape-последовательности будут интерпретироваться, поэтому они \t
становятся реальными, tab
а не \t
если это то, что вы ищете. Может быть решен с помощью ENVIRON[]
или доступ к нему черезARGV[]
PS Если вам нравятся три вертикальные черты в качестве разделителя |||
, от них нельзя убежать, поэтому используйте-F"[|][|][|]"
Пример получения данных из программы / функции inn в awk
(здесь используется дата)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Переменная после блока кода
Здесь мы получаем переменную после awk
кода. Это будет работать нормально, если вам не нужна переменная в BEGIN
блоке:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Добавление нескольких переменных:
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):
awk '{print $0}' <<< "$variable"
test
Это так же, как:
printf '%s' "$variable" | awk '{print $0}'
PS это обрабатывает переменную как файл ввода.
ENVIRON
вход
Как пишет TrueY, вы можете использовать ENVIRON
для печати переменных среды . Задав переменную перед запуском AWK, вы можете распечатать ее следующим образом:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
вход
Как пишет Стивен Пенни, вы можете использовать ARGV
данные в awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Чтобы получить данные в самом коде, а не только НАЧАТЬ:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Переменная в коде: использовать с осторожностью
Вы можете использовать переменную в awk
коде, но она грязная и трудная для чтения, и, как Charles Duffy
отмечается, эта версия также может стать жертвой внедрения кода. Если кто-то добавляет в переменную плохой материал, он будет выполнен как часть awk
кода.
Это работает путем извлечения переменной в коде, поэтому она становится ее частью.
Если вы хотите создать awk
динамическое изменение с использованием переменных, вы можете сделать это таким образом, но НЕ используйте его для обычных переменных.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Вот пример внедрения кода:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
Вы можете добавить много команд awk
таким образом. Даже сбой с недействительными командами.
Дополнительная информация:
Использование двойной кавычки
Всегда полезно "$variable"
заключить в кавычки переменную. Если нет, несколько строк будут добавлены в виде одной длинной строки.
Пример:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Другие ошибки, которые вы можете получить без двойной кавычки:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
И с одинарной кавычкой, это не расширяет значение переменной:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Больше информации о AWK и переменных
Прочитайте этот FAQ .