Заметки о решаемых задачах АйТишников

Сделал - запиши. Нашёл - сохрани :)

Прошу прощения за рекламу на сайте. Я постарался сделать это максимально ненавязчиво и по минимуму. При чтении заинтересовавших вас статей она не будет вам мешать.
И если есть возможность поставить мой сайт в исключения у блокировщика рекламы, я буду очень признателен вам.

Введение в команду AWK с примерами и пояснениями

Введение в команду AWK с примерами и пояснениями

 

 

 

Важное замечание по экранированию символа `$` в Debian и подобных дистрибутивах:
В большинстве документации и примеров для `awk` можно встретить запись с экранированием символа `$` — например, `$1`, `$3` и т.д. Это нужно в некоторых оболочках или системах для предотвращения подстановки переменных оболочкой.

Однако в Debian и большинстве современных Linux-дистрибутивов при использовании одинарных кавычек (`'...'`) экранировать `$` не требуется.
Таким образом, запись вида

awk -F: '\$3 >= 1000 { print \$1 }' /etc/passwd
> 

следует писать проще и корректнее как

awk -F: '$3 >= 1000 { print $1 }' /etc/passwd
> 

Это упрощает запись и улучшает читаемость команд.


Основы синтаксиса

Общий вид команды:

awk 'условие {действие}' файл
  • условие — выражение, определяющее, к каким строкам применять действие.
  • действие — набор команд, выполняемых для строк, удовлетворяющих условию.
  • Если условие опущено, действие выполняется для всех строк.
  • Если действие опущено, по умолчанию выводится вся строка.

Разделение полей

По умолчанию `awk` разбивает каждую строку на поля, разделённые пробелом или табуляцией.

  • `$0` — вся строка целиком.
  • `$1` — первое поле.
  • `$2` — второе поле.
  • и так далее.

Можно изменить разделитель полей с помощью опции `-F` или внутри программы, задав переменную `FS`.


Примеры использования

1. Вывод определённого столбца

Вывести первый столбец файла `/etc/passwd` (имена пользователей):

awk -F: '{ print $1 }' /etc/passwd

Здесь разделитель `-F:` — двоеточие, так как поля в `/etc/passwd` разделены двоеточиями.


2. Фильтрация строк по условию

Вывести строки, где третий столбец (UID) больше или равен 1000:

awk -F: '$3 >= 1000 { print $0 }' /etc/passwd

Можно опустить `{ print $0 }`, так как по умолчанию выводится вся строка:

awk -F: '$3 >= 1000' /etc/passwd

3. Суммирование значений

Посчитать сумму чисел во втором столбце файла `data.txt`:

awk '{ sum += $2 } END { print sum }' data.txt
  • `sum += $2` — для каждой строки добавляем значение второго поля к переменной `sum`.
  • `END { print sum }` — после обработки всех строк выводим сумму.

4. Использование переменных и условий

Вывести строки, где значение второго поля больше 50, и показать только первое и второе поле:

awk '$2 > 50 { print $1, $2 }' data.txt

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

Вывести имя пользователя и UID из `/etc/passwd` с форматированием:

awk -F: '{ printf "User: %s, UID: %d\n", $1, $3 }' /etc/passwd

Полезные переменные `awk`

  • `NR` — номер текущей обрабатываемой строки.
  • `NF` — количество полей в текущей строке.
  • `FS` — разделитель полей (input field separator).
  • `OFS` — разделитель полей при выводе (output field separator).

Пример сложной задачи

Вывести имена пользователей и их полные имена (GECOS) только для обычных пользователей с UID от 1000 до 65533:

awk -F: '$3 >= 1000 && $3 < 65534 { print $1, "-", $5 }' /etc/passwd

Заключение

`awk` — универсальный инструмент для обработки текстовых данных. Он позволяет быстро фильтровать, преобразовывать и анализировать данные, используя простой, но мощный язык программирования. Освоение `awk` значительно расширит ваши возможности работы с текстовыми файлами в Linux.

 

29 июня 2025, 12:03    Александр Linux 0    103 0

 

 

 

 



Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.