Команды Linux и навыки работы с оболочкой
awk: Когда столбцы становятся программами
awk — это то, к чему вы стремитесь, когда столбцы становятся единицей работы: журналы доступа nginx, /etc/passwd, вывод df, все, что находится в полях. Это полноценный язык (переменные, массивы, арифметика, правила действий с шаблонами), одетый в одежду однострочника, что является идеальной маскировкой для криминалистики журналов. Честная граница: все, что awk делает с комфортом, — это однострочный код, а все, что требует страницы блоков, — это скрипт Python, который еще не признал себя.
Главное
- Разделение полей — это основной трюк: awk -F: '$3 >= 1000 {print $1}' /etc/passwd перечисляет реальных пользователей, а -F'[,|]' обрабатывает многосимвольные разделители, когда Cut уже сдался.
- Подсчет с помощью ассоциативных массивов: awk '{count[$1]++} END {for (c in count) print count[c], c}' /var/log/secure превращает любой журнал в таблицу частот в одной строке.
- Вопросы файлов ответов NR и NF: «NR==1» — это строка заголовка, «{print NF}» подсчитывает столбцы в каждой строке, а сравнение NR со значениями, сохраненными в другом файле, позволяет обнаружить дубликаты и пробелы.
- Сопоставление плюс извлечение — это хлеб насущный: awk '/ 500 / {print $7, $9}' access.log извлекает страницы ошибок с URL-адресами, а OFS позволяет перепечатать $0 после редактирования одного поля, не переписывая строку самостоятельно.
- В блоках BEGIN и END выполняется совокупная работа: BEGIN устанавливает разделители, средние правила выполняются для каждой строки, END печатает итоговые значения; три блока читаются нормально, пять — это замаскированный сценарий.
- Кавычки — настоящий враг однострочных команд оболочки: заключайте программу в одинарные кавычки, литералы внутри нее в двойные кавычки и помните, что $7 внутри строки оболочки в двойных кавычках вообще никогда не достигает awk.
- Числовая работа получает LC_ALL=C: запятые локали в числах и нечетные параметры сортировки превращают сравнение и сортировку в сторону, а закрепление локали — это одна строка, которая экономит день.
- Знайте потолок: запятые в кавычках внутри CSV, вложенный JSON или многострочные форматы с отслеживанием состояния переходят в Python; awk — это скальпель, и он им останется.
Заметка из практики
Однострочная программа awk, которая суммировала столбцы журнала в долларах с запятыми, выдавала числа, которые никто не подвергал сомнению, пока бухгалтерия не открыла отчет. На этой неделе LC_ALL=C переехал в нашу библиотеку псевдонимов и остался там.
Частые вопросы
awk или вырезать для работы с колонками?
вырезать один фиксированный разделитель и простой список столбцов; awk в тот момент, когда появляются условия, регулярное выражение, арифметика или агрегаты, и в этот момент Cut все равно выходит за пределы своей глубины.
Как суммировать или усреднять столбец?
Агрегация в END: awk '{s += $5} END {print s, s/NR}' добавляет и усредняет пятое поле по строкам; сначала удалите разделители тысяч, если локаль ставит запятые в числа.
Почему моя однострочная программа awk ведет себя по-другому в macOS?
macOS поставляет POSIX awk без расширений GNU, таких как -i inplace или gensub; сценарии, работающие в Linux, могут там спокойно давать сбои, поэтому сохраняйте однострочники в форме POSIX или носите с собой gawk.
Может ли awk анализировать JSON?
Неосмысленно: JSON не имеет структуры столбцов, которую понимает awk, и хаки регулярных выражений ломаются на вложенных объектах. Используйте jq, который представляет собой форму awk для JSON, или модуль json Python, когда задание увеличивается.
Как мы берём на себя команды linux и навыки работы с оболочкой
Это то, чем мы занимаемся каждый день: Команды и сценарии сценариев, которые решают, управляет ли администратор сервером или борется с ним: поиск, преобразование, передача и контроль текста и процессов с помощью инструментов, которые есть в каждой базовой установке. Наша услуга Безопасность серверов Linux и Администрирование серверов закрывает задачу целиком — оценка, внедрение, круглосуточный мониторинг и экстренная реакция в течение 30 минут.