Введення змінних оболонок у 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}'
Попередження . Як пише Ед Мортон, послідовності втечі будуть інтерпретуватися так, що \t
стає реальністю, tab
а не, \t
якщо саме це ви шукаєте. Можна вирішити за допомогою ENVIRON[]
або отримати доступ до нього черезARGV[]
PS Якщо вам подобається три вертикальні смуги в якості роздільника |||
, його неможливо уникнути, тому використовуйте-F"[|][|][|]"
Приклад отримання даних із програми / функції заїзду до 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
для отримання даних у див:
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 та змінні
Прочитайте цей текст .