awk
переменные
Поиск…
Назначение переменной командной строки
Чтобы назначить переменные из командной строки, можно использовать -v :
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
Обратите внимание, что вокруг знака равенства нет пробелов.
Это позволяет использовать переменные оболочки:
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
Кроме того, это позволяет устанавливать встроенные переменные, которые управляют awk :
См. Пример с FS (разделитель полей):
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
Или с OFS (разделитель выходного поля):
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
Передача параметров программе с использованием опции -v
Опция -v за которой следует назначение переменной variable = value, может использоваться для передачи параметров в awk- программу. Это иллюстрируется нижеприведенной программой наказания , задачей которой является запись отсчета времени на предложение «Я не буду говорить в классе» на стандартном выходе. В следующем примере используется значение 100, которое очень популярно среди учителей:
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
Можно передать несколько параметров с повторным использованием флага -v :
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Нет встроенной поддержки параметров массива или списка, их нужно обрабатывать вручную. Классический подход для передачи параметра списка заключается в объединении списка с использованием разделителя, популярными являются : | или , . Функция split затем позволяет восстановить список как массив awk :
awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
list_sz = split(serialised_list, list, ":")
for(i = 1; i <= list_sz; ++i) {
printf("list: %d: %s\n", i, list[i])
}
exit
}'
Вывод этой awk- программы
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
Иногда удобнее восстанавливать элементы списка как ключи массива awk , так как это позволяет легко проверять членство. Например, следующая программа печатает каждую строку, первое слово которой не принадлежит к фиксированному списку исключений:
awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
_list_sz = split(serialised_exception_list, _list, ":")
for(i = 1; i <= _list_sz; ++i) {
exception[_list[i]]
}
}
! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF
Вывод этой программы
pineapple Do you like pineapple?
В качестве последнего примера мы покажем, как обернуть программу наказания в сценарий оболочки, поскольку это иллюстрирует, как сценарий оболочки передает параметры вспомогательному awk- скрипту:
#!/bin/sh
usage()
{
cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
Prepare your punishments for you
EOF
}
punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
case "${OPTION}" in
c) punishment_count="${OPTARG}";;
s) punishment_sentence="${OPTARG}";;
h) usage; exit 0;;
*) usage; exit 64;;
esac
done
awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
Местные переменные
Язык awk напрямую не поддерживает переменные, локальные для функций. Однако легко эмулировать их, добавляя дополнительные аргументы в функции. Традиционно префикс этих переменных обозначается _ чтобы указать, что они не являются фактическими параметрами.
Мы проиллюстрируем эту технику с помощью определения функции single_quote которая добавляет одинарные кавычки вокруг строки:
# single_quote(TEXT)
# Return a string made of TEXT surrounded by single quotes
function single_quote(text, _quote) {
_quote = sprintf("%c", 39)
return sprintf("%s%s%s", _quote, text, _quote);
}
Более простой подход использования sprintf("'%s'", text) приводит к практическим проблемам, поскольку awk- скрипты обычно передаются как одинарные кавычки для awk- программы.
Аргументы присваивания
Аргументы присваивания появляются в конце awk вызова, в той же области, что и переменные файла, и назначения -v назначения аргументов должны соответствовать следующему регулярному выражению. (предполагая локаль POSIX)
^[[:alpha:]_][[:alnum:]_]*=
В следующем примере предполагается файл file содержащий следующее: 1 2 3 (выделение пробела)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3