Введення змінних оболонок у 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 та змінні
Прочитайте цей текст .