Info
Content

awk

Статья на хабре от ruvds
Статья на сайте ibm


Синтаксис

~$ awk OPTIONS PROGRAM FILE

  • OPTIONS - опции
  • PROGRAM - файл с программой на awk или строка с ней : '{print "Welcome to awk command tutorial"}'
  • FILE - файл который нужно обработать

Опции (основные)

  • -F fs — позволяет указать символ-разделитель для полей в записи, вот так можно указать его внутри скрипта FS=":"
  • -f file — указывает имя файла, из которого нужно прочесть awk-скрипт
  • -v var=value — позволяет объявить переменную и задать её значение по умолчанию, которое будет использовать awk
  • -mf N — задаёт максимальное число полей для обработки в файле данных
  • -mr N — задаёт максимальный размер записи в файле данных
  • -W keyword — позволяет задать режим совместимости или уровень выдачи предупреждений awk

Применение

По умолчанию, каждое слово заносится в переменную с именем $<номер слова в строке>, а через переменную $0 можно обратиться ко всей текущей строке, например $3 в текущей строке содержит значение каждое (под словом подразумевается поле выделенное из строки с помощью разделителя (по умолчанию пробел или табуляция))

Снимок-экрана-от-2019-05-27-10-29-03.png

Скрипты выглядят следующим образом: (точкой с запятой нужно разделять строки если они записаны в одну строку, а если нет то достаточно переноса строки) (чтобы выполнить какие-то инструкции до или после начала обработки текста, нужно добавить перед блоком такого кода соответственно слово BEGIN или END)

BEGIN {
  print "sosamba niga mazafaka"
}
{
  text = " has a  home directory at "
  print $1 text $6
}
END {
  print "konets sosamby"
}

Переменная $NF хранит последнее слово из строки

Снимок-экрана-от-2019-05-27-12-34-37.png

Переменные для обработки:

  • FIELDWIDTHS — разделённый пробелами список чисел, определяющий точную ширину каждого поля данных с учётом разделителей полей
  • FS — уже знакомая вам переменная, позволяющая задавать символ-разделитель полей
  • RS — переменная, которая позволяет задавать символ-разделитель записей
  • OFS — разделитель полей на выводе awk-скрипта
  • ORS — разделитель записей на выводе awk-скрипта

Пременные окружающей среды:

  • ARGC — количество аргументов командной строки
  • ARGV — массив с аргументами командной строки
  • ARGIND — индекс текущего обрабатываемого файла в массиве ARGV
  • ENVIRON — ассоциативный массив с переменными окружения и их значениями
  • ERRNO — код системной ошибки, которая может возникнуть при чтении или закрытии входных файлов
  • FILENAME — имя входного файла с данными
  • FNR — номер текущей записи в файле данных
  • IGNORECASE — если эта переменная установлена в ненулевое значение, при обработке игнорируется регистр символов
  • NF — общее число полей данных в текущей записи
  • NR — общее число обработанных записей

Например можно узнавать внутри скрипта об указанных ключах и значениях в команде или о домашей директории


Условный оператор

Однострочный вариант

if (УСЛОВИЕ) ДЕЙСТВИЕ

Обычный (если нужно выполниь несколько строк кода, то их нужно объединить фигурными скобками)

if (УСЛОВИЕ)
{
  ДЕЙСТВИЕ1
  ДЕЙСТВИЕ2
}

Снимок-экрана-от-2019-05-27-13-56-12.png


Циклы

Можно использовать оператор break и continue

  • while
while (УСЛОВИЕ)
{
  ДЕЙСТВИЕ1
  ДЕЙСТВИЕ2
}
  • for -
for (ИНИЦИАЛИЗАЦИЯ_СЧЕТЧИКА; УСЛОВИЕ; ИНКРЕМЕНТАЦИЯ)	# как в С-подобных языках
{
  ДЕЙСТВИЕ1
  ДЕЙСТВИЕ2
}

Фарматированный вывод printf

Вывод настраивается через спецификаторы в формате %[modifier]control-letter
Список спецификаторов:

  • c - воспринимает переданное ему число как код ASCII-символа и выводит этот символ
  • d - выводит десятичное целое число
  • i - то же самое, что и d
  • e - выводит число в экспоненциальной форме
  • f - выводит число с плавающей запятой
  • g - выводит число либо в экспоненциальной записи, либо в формате с плавающей запятой, в зависимости от того, как получается короче
  • o - выводит восьмеричное представление числа
  • s - выводит текстовую строку

Пример:

printf "The result is: %e\n", x

Встроенные функции

Ссылка на gnu.org на страницу с функциями

Пользовательские функции

function ИМЯ_ФУНКЦИИ()
{
  ТЕЛО_ФУНКЦИИ
}
No Comments
Back to top