Linux awk сумма по столбцу

Содержание
  1. Использование awk для суммирования значений столбца на основе значений другого столбца
  2. Команда AWK в Linux с примерами
  3. Как работает awk
  4. Записи и поля
  5. Программа awk
  6. Выполнение программ awk
  7. Шаблоны AWK
  8. Шаблоны регулярных выражений
  9. Шаблоны реляционных выражений
  10. Шаблоны диапазонов
  11. Специальные шаблоны выражения
  12. Комбинирование узоров
  13. Встроенные переменные
  14. Изменение поля и разделителя записей
  15. Действия при отсутствии нагрузки
  16. Использование переменных оболочки в программах AWK
  17. Выводы
  18. 13 инструментов для обработки текста в командной оболочке
  19. Содержание
  20. Обработка текста в командной оболочке
  21. paste
  22. Замена текста
  23. Реальные примеры
  24. Фильтрация CSV с помощью grep и awk
  25. Вывод адреса IPv4, связанного с сетевым интерфейсом
  26. Извлечение значения из файла конфигурации
  27. Извлечение IP-адресов из файла журнала
  28. Переименование функции в исходном файле
  29. Углубляемся: циклы for и xargs
  30. Резюме
  31. Что дальше

Использование awk для суммирования значений столбца на основе значений другого столбца

Я пытаюсь суммировать определенные числа в столбце, используя awk . Я хотел бы суммировать только столбец 3 «кузнецов», чтобы получить в общей сложности 212. Я могу суммировать весь столбец, используя awk не только «кузнецов». У меня есть:

Также я использую замазку. Спасибо за любую помощь.

  • -F Флаг устанавливает разделитель полей; Я поместил его в одинарные кавычки, потому что это специальный символ оболочки.
  • Затем $1

/smiths/ применяет следующий <кодовый блок>только к строкам, где первое поле соответствует регулярному выражению /smiths/ .

  • Остальное так же, как ваш код.
  • Обратите внимание, что поскольку вы на самом деле здесь не используете регулярное выражение, а просто конкретное значение, вы можете также легко использовать:

    Который проверяет равенство строк. Это эквивалентно использованию регулярного выражения /^smiths$/ , как упомянуто в другом ответе, который включает в себя привязку, которая соответствует ^ только началу строки (начало поля 1), и $ привязку, чтобы соответствовать только концу строки. Не уверен, насколько вы знакомы с регулярными выражениями. Они очень мощные, но для этого случая вы можете использовать проверку на равенство строк так же легко.

    Другой подход заключается в использовании ассоциативных массивов awk, подробнее здесь . Эта строка производит желаемый результат:

    Как побочный эффект, массив хранит все другие значения:

    Очень хорошо, пока. Все, что вам нужно сделать, это добавить селектор перед блоком, чтобы добавить сумму. Здесь мы проверяем, что первый аргумент содержит только «кузнецы»:

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

    • -F Возможность указать разделитель.
    • $NF для «последнего столбца».

    Я лично предпочел бы сохранить awk раздел как можно более простым и делать как можно больше без него. Логика Comingled не использует возможности конвейеров Unix и, следовательно, сложнее понять, отладить или изменить для тесно связанных случаев использования.

    Источник

    Команда AWK в Linux с примерами

    Awk — это язык сценариев общего назначения, предназначенный для расширенной обработки текста. В основном он используется как инструмент отчетности и анализа.

    В отличие от большинства других процедурных языков программирования, awk управляется данными, что означает, что вы определяете набор действий, выполняемых с вводимым текстом. Он принимает входные данные, преобразует их и отправляет результат на стандартный вывод.

    В этой статье рассматриваются основы языка программирования awk. Знание основ awk значительно улучшит вашу способность манипулировать текстовыми файлами в командной строке.

    Как работает awk

    Существует несколько различных реализаций awk. Мы будем использовать GNU-реализацию awk, которая называется gawk. В большинстве систем Linux интерпретатор awk — это просто символическая ссылка на gawk .

    Записи и поля

    Awk может обрабатывать текстовые файлы данных и потоки. Входные данные разделены на записи и поля. Awk работает с одной записью за раз, пока не будет достигнут конец ввода. Записи разделяются символом, который называется разделителем записей. Разделителем записей по умолчанию является символ новой строки, что означает, что каждая строка в текстовых данных является записью. Новый разделитель записей может быть установлен с помощью переменной RS .

    Записи состоят из полей, разделенных разделителем полей. По умолчанию поля разделяются пробелом, включая один или несколько символов табуляции, пробела и новой строки.

    Поля в каждой записи обозначаются знаком доллара ( $ ), за которым следует номер поля, начинающийся с 1. Первое поле представлено с помощью $1 , второе — с помощью $2 и так далее. На последнее поле также можно ссылаться с помощью специальной переменной $NF . На всю запись можно ссылаться с помощью $0 .

    Вот визуальное представление, показывающее, как ссылаться на записи и поля:

    Программа awk

    Чтобы обработать текст с помощью awk , вы пишете программу, которая сообщает команде, что делать. Программа состоит из ряда правил и пользовательских функций. Каждое правило содержит одну пару шаблон и действие. Правила разделяются новой строкой или точкой с запятой ( ; ). Обычно awk-программа выглядит так:

    Когда awk обрабатывает данные, если шаблон соответствует записи, он выполняет указанное действие с этой записью. Если у правила нет шаблона, все записи (строки) совпадают.

    Действие awk заключено в фигурные скобки ( <> ) и состоит из операторов. Каждый оператор определяет операцию, которую нужно выполнить. В действии может быть несколько операторов, разделенных новой строкой или точкой с запятой ( ; ). Если правило не имеет действия, по умолчанию выполняется печать всей записи.

    Awk поддерживает различные типы операторов, включая выражения, условные операторы, операторы ввода, вывода и т. Д. Наиболее распространенные операторы awk:

    • exit — останавливает выполнение всей программы и выходит.
    • next — останавливает обработку текущей записи и переходит к следующей записи во входных данных.
    • print — Печать записей, полей, переменных и настраиваемого текста.
    • printf — дает вам больше контроля над форматом вывода, аналогично C и bash printf .

    При написании программ awk все, что находится после решетки (#) и до конца строки, считается комментарием. Длинные строки можно разбить на несколько строк с помощью символа продолжения, обратной косой черты ( ).

    Выполнение программ awk

    Программа awk может быть запущена несколькими способами. Если программа короткая и простая, ее можно передать непосредственно интерпретатору awk из командной строки:

    При запуске программы в командной строке ее следует заключать в одинарные кавычки ( » ), чтобы оболочка не интерпретировала программу.

    Если программа большая и сложная, лучше всего поместить ее в файл и использовать параметр -f для передачи файла команде awk :

    В приведенных ниже примерах мы будем использовать файл с именем «team.txt», который выглядит примерно так:

    Шаблоны AWK

    Шаблоны в awk определяют, следует ли выполнять соответствующее действие.

    Awk поддерживает различные типы шаблонов, включая регулярное выражение, выражение отношения, диапазон и шаблоны специальных выражений.

    Если у правила нет шаблона, сопоставляется каждая входная запись. Вот пример правила, содержащего только действие:

    Программа распечатает третье поле каждой записи:

    Шаблоны регулярных выражений

    Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблоны регулярных выражений AWK заключаются в косую черту ( // ):

    Самый простой пример — это буквальное сопоставление символа или строки. Например, чтобы отобразить первое поле каждой записи, содержащее «0,5», вы должны выполнить следующую команду:

    Шаблон может быть любым типом расширенного регулярного выражения. Вот пример, который печатает первое поле, если запись начинается с двух или более цифр:

    Шаблоны реляционных выражений

    Шаблоны реляционных выражений обычно используются для сопоставления содержимого определенного поля или переменной.

    Читайте также:  Активировал windows по телефону

    По умолчанию шаблоны регулярных выражений сопоставляются с записями. Чтобы сопоставить регулярное выражение с полем, укажите поле и используйте оператор сравнения «содержать» (

    Например, чтобы напечатать первое поле каждой записи, второе поле которой содержит «ia», вы должны ввести:

    Чтобы сопоставить поля, которые не содержат заданного шаблона, используйте оператор !

    Вы можете сравнивать строки или числа для таких отношений, как, больше, меньше, равно и т. Д. Следующая команда печатает первое поле всех записей, третье поле которых больше 50:

    Шаблоны диапазонов

    Шаблоны диапазонов состоят из двух шаблонов, разделенных запятой:

    Все записи, начинающиеся с записи, соответствующей первому шаблону, до совпадения с записью, соответствующей второму шаблону.

    Вот пример, который напечатает первое поле всех записей, начиная с записи, включая «Raptors», до записи, включающей «Celtics»:

    Шаблоны также могут быть выражениями отношений. Приведенная ниже команда распечатает все записи, начиная с той, четвертое поле которой равно 32, до той, четвертое поле которой равно 33:

    Шаблоны диапазона нельзя комбинировать с другими выражениями шаблона.

    Специальные шаблоны выражения

    Awk включает следующие специальные паттерны:

    • BEGIN — используется для выполнения действий перед обработкой записей.
    • END — используется для выполнения действий после обработки записей.

    Шаблон BEGIN обычно используется для установки переменных, а шаблон END для обработки данных из записей, таких как вычисления.

    В следующем примере печатается «Начать обработку.», Затем печатается третье поле каждой записи и, наконец, «Завершить обработку».

    Если программа имеет только шаблон BEGIN , действия выполняются, а ввод не обрабатывается. Если в программе есть только шаблон END , ввод обрабатывается перед выполнением действий правила.

    Версия awk для Gnu также включает еще два специальных шаблона BEGINFILE и ENDFILE , которые позволяют выполнять действия при обработке файлов.

    Комбинирование узоров

    Awk позволяет комбинировать два или более шаблонов, используя логический оператор И ( && ) и логический оператор ИЛИ ( || ).

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

    Встроенные переменные

    Awk имеет ряд встроенных переменных, которые содержат полезную информацию и позволяют управлять обработкой программы. Ниже приведены некоторые из наиболее распространенных встроенных переменных:

    • NF — количество полей в записи.
    • NR — номер текущей записи.
    • FILENAME — имя входного файла, который в данный момент обрабатывается.
    • FS — Разделитель полей.
    • RS — Разделитель записей.
    • OFS — Разделитель выходных полей.
    • ORS — разделитель выходной записи.

    Вот пример, показывающий, как напечатать имя файла и количество строк (записей):

    Переменные в AWK могут быть установлены в любой строке программы. Чтобы определить переменную для всей программы, поместите ее в шаблон BEGIN .

    Изменение поля и разделителя записей

    По умолчанию значение разделителя полей — любое количество пробелов или символов табуляции. Его можно изменить, установив в переменной FS .

    Например, чтобы установить разделитель полей . вы бы использовали:

    Разделитель полей также может содержать более одного символа:

    При запуске однострочных команд awk в командной строке вы также можете использовать параметр -F для изменения разделителя полей:

    По умолчанию разделителем записей является символ новой строки, который можно изменить с помощью переменной RS .

    Вот пример, показывающий, как изменить разделитель записей на . :

    Действия при отсутствии нагрузки

    Действия awk заключаются в фигурные скобки ( <> ) и выполняются при совпадении с шаблоном. Действие может иметь ноль или более утверждений. Несколько операторов выполняются в том порядке, в котором они появляются, и должны быть разделены новой строкой или точкой с запятой ( ; ).

    В awk поддерживается несколько типов операторов действий:

    • Выражения, такие как присваивание переменных, арифметические операторы, операторы увеличения и уменьшения.
    • Управляющие операторы, используемые для управления потоком программы ( if , for , while , switch и т. Д.)
    • Операторы вывода, такие как print и printf .
    • Составные утверждения, чтобы сгруппировать другие утверждения.
    • Операторы ввода, чтобы управлять обработкой ввода.
    • Операторы удаления для удаления элементов массива.

    Оператор print вероятно, является наиболее часто используемым оператором awk. Он печатает форматированный вывод текста, записей, полей и переменных.

    При печати нескольких элементов их нужно разделять запятыми. Вот пример:

    Печатные материалы разделяются одиночными пробелами:

    Если вы не используете запятые, между элементами не будет пробелов:

    Печатные элементы объединены:

    Когда print используется без аргументов, по умолчанию используется print $0 . Текущая запись будет напечатана.

    Чтобы напечатать собственный текст, вы должны заключить текст в двойные кавычки:

    Вы также можете печатать специальные символы, такие как новая строка:

    Оператор printf дает вам больше контроля над форматом вывода. Вот пример вставки номеров строк:

    printf не создает новую строку после каждой записи, поэтому мы используем n :

    Следующая команда вычисляет сумму значений, хранящихся в третьем поле в каждой строке:

    Вот еще один пример, показывающий, как использовать выражения и управляющие операторы для печати квадратов чисел от 1 до 5:

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

    Запустите программу, передав имя файла интерпретатору awk :

    Вы также можете запустить программу awk как исполняемый файл, используя директиву shebang и установив интерпретатор awk :

    Теперь вы можете запустить программу, введя:

    Использование переменных оболочки в программах AWK

    Если вы используете команду awk в сценариях оболочки, велика вероятность, что вам потребуется передать переменную оболочки программе awk. Один из вариантов — заключить программу в двойные вместо одинарных кавычек и подставить переменную в программе. Однако эта опция сделает вашу awk-программу более сложной, так как вам нужно будет избежать переменных awk.

    Рекомендуемый способ использования переменных оболочки в программах awk — присвоить переменную оболочки переменной awk. Вот пример:

    Выводы

    Awk — один из самых мощных инструментов для работы с текстом.

    Эта статья едва затрагивает поверхность языка программирования awk. Чтобы узнать больше об awk, ознакомьтесь с официальной документацией Gawk .

    Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

    Источник

    13 инструментов для обработки текста в командной оболочке

    Здесь представлен фрагмент будущей книги «Основные инструменты и практики для начинающего разработчика программного обеспечения» Бальтазара Рубероля и Этьена Броду. Книга должна помочь образованию подрастающего поколения разработчиков. Она охватит такие темы, как освоение консоли, настройка и эффективная работа в командной оболочке, управление версиями кода с помощью git , основы SQL, инструменты вроде Make , jq и регулярные выражения, основы сетевого взаимодействия, а также лучшие практики разработки программного обеспечения и совместной работы. В настоящее время авторы упорно работают над этим проектом и приглашают всех поучаствовать в списке рассылки.

    Содержание

    Обработка текста в командной оболочке

    Одна из причин, которые делают командную оболочку бесценным инструментом, — это большое количество команд обработки текста и возможность легко объединять их в конвейер, создавая сложные шаблоны обработки. Эти команды делают тривиальными многие задачи по анализу текста и данных, преобразованию данных между разными форматами, по фильтрации строк и т. д.

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

    Заставьте каждую программу хорошо выполнять одну функцию — «Основы философии Unix»

    Примеры из этой главы на первый взгляд могут показаться немного надуманными, но это сделано специально. Каждый из инструментов разработан для решения одной небольшой задачи. Однако в сочетании они становятся чрезвычайно мощными.

    Читайте также:  Python desktop path windows

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

    Файл CSV с примерами доступен в онлайне. Можете скачать его для проверки материала.

    Команда cat используется для составления списка из одного или нескольких файлов и отображения их содержимого на экране.

    head выводит первые n строк в файле. Это может быть очень полезно для того, чтобы заглянуть в файл неизвестной структуры и формата, не заваливая всю консоль кучей текста.

    Если -n не указано, head выводит первые десять строк указанного файла или входящего потока.

    tail — аналог head , только он выводит последние n строк в файле.

    Если хотите вывести все строки, расположенном после n-й строки (включая её), можете использовать аргумент -n +n .

    В нашем файле 43 строки, поэтому tail -n +42 выводит только 42-ю и 43-ю строки из него.

    Если параметр -n не указан, tail выведет последние десять строк в указанном файле или входном потоке.

    tail -f или tail —follow отображают последние строки в файле и каждую новую строку по мере записи в файл. Это очень полезно для просмотра активности в реальном времени, например, что записывается в логи веб-сервера и т. д.

    wc (word count) выводит количество символов ( -c ), слов ( -w ) или строк ( -l ) в указанном файле или потоке.

    По умолчанию отображается всё вышеперечисленное.

    Если текстовые данные передаются по конвейеру или перенаправлены в stdin , то отображается только счётчик.

    grep — это швейцарский нож фильтрации строк по заданному шаблону.

    Например, можем найти все вхождения слова mutex в файле.

    grep может обрабатывать либо файлы, указанные в качестве аргументов, либо поток текста, переданный на его stdin . Таким образом, мы можем сцеплять несколько команд grep для дальнейшей фильтрации текста. В следующем примере мы фильтруем строки в нашем файле metadata.csv , чтобы найти строки, содержащие и mutex, и OS.

    Рассмотрим некоторые опции grep и их поведение.

    grep -v выполняет инвертное сопоставление: фильтрует строки, которые не соответствуют шаблону аргументов.

    grep -i выполняет сопоставление без учёта регистра. В следующем примере grep -i os находит как OS, так и os.

    grep -l выводит список файлов, содержащих совпадение.

    Команда grep -c подсчитывает, сколько раз найден образец.

    grep -r рекурсивно ищет файлы в текущем рабочем каталоге и всех его подкаталогах.

    grep -w показывает только совпадающие целиком слова.

    cut извлекает часть файла (или, как обычно, входного потока). Команда определяет разделитель полей (который разделяет столбцы) с помощью опции -d , а порядковые номера столбцов для извлечения с помощью опции -f .

    Например, следующая команда извлекает первый столбец из последних пяти строк нашего CSV-файла.

    Поскольку мы имеем дело с CSV, то столбцы разделяются запятой, а за извлечение первого столбца отвечает опция -f 1 .

    Можно выбрать и первый, и второй столбцы, используя опцию -f 1,2 .

    paste

    paste объединяет вместе два разных файла в один многоколоночный файл.

    По умолчанию paste использует разделитель табуляции, но его можно изменить с помощью параметра -d .

    Ещё один распространённый способ использования paste — объединение всех строк в потоке или файле с помощью заданного разделителя, используя комбинацию аргументов -s и -d .

    Если в качестве входного файла указан параметр — , то вместо него будет считываться stdin .

    Команда sort , собственно, сортирует данные (в указанном файле или входном потоке).

    sort -r выполняет обратную сортировку.

    sort -n сортирует поля по их арифметическому значению.

    uniq обнаруживает и отфильтровывает соседние одинаковые строки в указанном файле или входном потоке.

    Поскольку uniq отфильтровывает только соседние строки, в наших данных могут ещё остаться дубликаты. Чтобы отфильтровать все одинаковые строки из файла, нужно сначала отсортировать его содержимое.

    uniq -c в начале каждой строки вставляет количество её вхождений.

    uniq -u отображает только уникальные строки.

    Примечание. uniq особенно полезен в сочетании с сортировкой, поскольку конвейер | sort | uniq позволяет удалить все дублирующиеся строки в файле или потоке.

    awk — это чуть больше, чем просто инструмент обработки текста: на самом деле у него целый язык программирования. В чём awk действительно хорош — так это в разбиении файлов на столбцы, и делает это с особенным блеском, когда в файлах перемешаны пробелы и табы.

    Примечание. cat -t отображает табы как ^I .

    Как видим, столбцы разделены либо пробелами, либо табуляциями, и не всегда одинаковым количеством пробелов. cut здесь бесполезен, потому что работает только с одним символом-разделителем. Но awk легко разберётся с таким файлом.

    awk ‘< print $n >‘ выводит n-й столбец в тексте.

    Хотя awk способен на гораздо большее, выдача колонок составляет, наверное, 99% вариантов использования в моём личном случае.

    Примечание. < print $NF >выводит последний столбец в строке.

    tr расшифровывается как translate. Эта команда заменяет одни символы на другие. Она работает либо с символами, либо с классами символов, такими как строчные, печатные, пробелы, буквенно-цифровые и т. д.

    На стандартных входных данных tr заменяет все вхождения на .

    tr может переводить классы символов с помощью нотации [:class:] . Полный список доступных классов описан на справочной странице tr , но некоторые продемонстрируем здесь.

    [:space:] представляет все типы пробелов, от простого пробела до табуляции или символа новой строки.

    Все символы, похожие на пробелы, переведены в запятую. Обратите внимание, что символ % в конце выдачи означает отсутствие завершающей новой строки. Действительно, этот символ тоже переведён в запятую.

    [:lower:] представляет все строчные символы, а [:upper:] — все прописные. Таким образом, преобразование между ними становится тривиальным.

    tr -c SET1 SET2 преобразует любой символ, не входящий в набор SET1, в символы набора SET2. В следующем примере все символы, кроме указанных гласных, заменяются пробелами.

    tr -d удаляет указанные символы, а не заменяет их. Это эквивалент tr » .

    tr также может заменить диапазоны символов, например, все буквы между a и e или все числа между 1 и 8, используя нотацию s-e , где s — начальный символ, а e — конечный.

    Команда tr -s string1 сжимает все множественные вхождения символов в string1 в одно-единственное. Одним из наиболее полезных применений tr -s является замена нескольких последовательных пробелов одним.

    Команда fold сворачивает все входные строки до заданной ширины. Например, может быть полезно убедиться, что текст помещается на дисплеях небольшого размера. Так, fold -w n укладывает строки по ширине n символов.

    Команда fold -s будет разбивать строки только на символах пробела. Её можно объединить с предыдущей, чтобы ограничить строким заданным количеством символом.

    sed — это неинтерактивный потоковый редактор, который используется для преобразования текста во входном потоке строка за строкой. В качестве входных данных используется или файл, или stdin , а на выходе тоже или файл, или stdout .

    Команды редактора могут включать один или несколько адресов, функцию и параметры. Таким образом, команды выглядят следующим образом:

    Хотя sed выполняет множество функций, мы рассмотрим только замену текста как один из самых распространённых вариантов использования.

    Замена текста

    Команда замены sed выглядит следующим образом:

    Пример: замена первого экземпляра слова в каждой строке в файле:

    Читайте также:  Недоступен диск или сетевой ресурс windows 10

    Мы видим, что в первой строчке заменяется только первый экземпляр hello . Чтобы заменить все вхождения hello во всех строках, можно использовать опцию g (означает global).

    sed позволяет использовать любые разделители, кроме / , что особенно улучшает читаемость, если в самих аргументах команды есть слэши.

    Адрес говорит редактору, в какой строке или диапазоне строк выполнять подстановку.

    Адрес 1 указывает заменять hello на Hey I just met you в первой строке. Можем указать диапазон адресов в нотации , , где может быть либо номером строки, либо $ , то есть последней строкой в файле.

    По умолчанию sed выдаёт результат в свой stdout , но может отредактировать и оригинальный файл с опцией -i .

    Примечание. В Linux достаточно только -i . Но в macOS поведение команды немного отличается, поэтому сразу после -i нужно добавить » .

    Реальные примеры

    Фильтрация CSV с помощью grep и awk

    В этом примере grep в файле metadata.csv сначала фильтрует строки, содержащие слово gauge , затем те, у которых query в четвёртой колонке, и выводит название метрики (1-я колонка) с соответствующим значением per_unit_name (5-я колонка).

    Вывод адреса IPv4, связанного с сетевым интерфейсом

    Команда ifconfig выводит сведения по указанному сетевому интерфейсу. Например:

    Затем запускаем grep для inet , что выдаст две строки соответствия.

    Затем с помощью grep -v исключаем строку с ipv6 .

    Наконец, с помощью awk запрашиваем второй столбец в этой строке: это IPv4-адрес, связанный с нашим сетевым интерфейсом en0 .

    Примечание. Мне предложили заменить grep inet | grep -v inet6 такой надёжной командой awk :

    Она короче и конкретно нацелена на IPv4 с условием $1 == «inet» .

    Извлечение значения из файла конфигурации

    В файле конфигурации git текущего пользователя ищем значение editor = , обрезаем знак = , извлекаем второй столбец и удаляем все пробелы вокруг.

    Извлечение IP-адресов из файла журнала

    Следующий реальный код ищет в журнале БД сообщение Too many connections from (за ним следует IP-адрес) и отображает десять главных нарушителей.

    Давайте разберем, что делает этот конвейер. Во-первых, как выглядит строка в журнале.

    Затем awk ‘< print $12 >‘ извлекает из строки IP-адрес.

    Команда sed ‘s@/@@’ удаляет начальный слэш.

    Примечание. Как мы уже видели ранее, в sed можно использовать любой разделитель. Хотя обычно в качестве разделителя используется / , здесь мы заменяем именно этот символ, что слегка ухудшит читаемость выражения подстановки.

    sort | uniq -c сортирует IP-адреса в лексикографическом порядке, а затем удаляет дубликаты, добавляя перед IP-адресами количество вхождений каждого.

    sort -rn | head -n 10 сортирует строки по количеству вхождений, численно и в обратном порядке, чтобы главные нарушители выводились в первую очередь, из которых отображаются 10 строк. Последняя команда awk < print $2 >извлекает сами IP-адреса.

    Переименование функции в исходном файле

    Представим, что мы работаем над проектом и хотели бы переименовать недачно названную функцию (или класс, переменную и т. д.) в исходном файле. Можно сделать это с помощью команды sed -i , которая выполняет замену прямо в оригинальном файле.

    Примечание. На macOS вместо sed -i используйте sed -i » .

    Однако мы переименовали функцию только в оригинальном файле. Это сломает импорт bool_from_str в любом другом файле, поскольку эта функция больше не определена. Нужно найти способ переименовать bool_from_str повсюду в нашем проекте. Такого можно добиться с помощью команд grep , sed , а также циклов for или с помощью xargs .

    Углубляемся: циклы for и xargs

    Чтобы заменить в нашем проекте все вхождения bool_from_str , сначала нужно рекурсивно найти их с помощью grep -r .

    Поскольку нас интересуют только файлы c совпадениями, также необходимо использовать опцию -l/—files-with-matches :

    Затем можем использовать команду xargs для осуществления действий с каждой строки выходных данных (то есть всех файлов, содержащих строку bool_from_str ).

    Опция -n 1 указывает, что каждая строка в выходных данных должна выполнить отдельную команду sed .

    Затем выполняются следующие команды:

    Если команда, которую вы вызываете с помощью xargs (в нашем случае sed ), поддерживает несколько аргументов, то следует отбросить аргумент -n 1 для производительности.

    Эта команда затем исполнит

    Примечание. Из синопсиса sed на ман-странице видно, что команда может принять несколько аргументов.

    Действительно, как мы видели в предыдущей главе, file . означает, что принимаются несколько аргументов, представляющих собой имена файлов.

    Мы видим, что произведены замены для всех вхождений bool_from_str .

    Как это часто бывает, существует несколько способов достижения одного и того же результата. Вместо xargs мы могли бы использовать циклы for , чтобы перебирать строки по списку и выполнять действие над каждым элементом. У этих циклов такой синтаксис:

    Если обернуть нашу команду grep в $() , то оболочка выполнит её в подоболочке, результат чего затем будет повторён в цикле for .

    Эта команда выполнит

    Синтаксис циклов for кажется мне более чётким, чем у xargs , однако последняя может выполнять команды параллельно, используя параметры -P n , где n — максимальное количество параллельных команд, выполняемых одновременно, что может дать выигрыш в производительности.

    Резюме

    Все эти инструменты открывают целый мир возможностей, так как позволяют извлекать и преобразовывать данные, создавая целые конвейеры из команд, которые, возможно, никогда не предназначались для совместной работы. Каждая из них выполняет относительно небольшую функцию (сортировка sort , объединение cat , фильтры grep , редактирование sed , вырезание cut и т. д.).

    Любую задачу, включающую текст, можно свести к конвейеру более мелких задач, каждая из которых выполняет простое действие и передаёт свои выходные данные в следующую задачу.

    Например, если нам хочется узнать, сколько уникальных IP-адресов в файле журнала, и чтобы эти IP-адреса всегда появлялись в одном и том же столбце, то можно запустить следующую последовательность команд:

    • grep строк, которые соответствуют шаблону строк с IP-адресами
    • найти столбец с IP-адресом, извлечь его с помощью awk
    • отсортировать список IP-адресов с помощью sort
    • устранить смежные дубликаты с помощью uniq
    • подсчитать количество строк (то есть уникальных IP-адресов) с помощью wc -l

    Поскольку есть множество нативных и сторонних инструментов обработки текста, также много способов решить любую задачу.

    Примеры в этой статье были надуманными, но я предлагаю вам прочитать удивительную статью «Инструменты командной строки могут быть в 235 раз быстрее, чем ваш кластер Hadoop», чтобы получить представление о том, насколько полезны и мощны эти команды на самом деле и какие реальные проблемы они могут решить.

    Что дальше

    1. Подсчитайте количество файлов и каталогов, расположенных в вашем домашнем каталоге.
    2. Отобразите содержимое файла только прописными буквами.
    3. Подсчитайте, сколько раз встречалось каждое слово в файле.
    4. Подсчитайте количество гласных в файле. Отсортируйте результат от наиболее распространённой до наименее распространённой буквы.

    Будущая книга «Основные инструменты и практики для начинающего разработчика программного обеспечения» (Essential Tools and Practices for the Aspiring Software Developer) Бальтазара Рубероля и Этьена Броду поможет создать продуктивную среду разработки и познакомиться с полезными инструментами и практиками, которые нужны для профессионального роста. Как уже было сказано, она охватит такие темы, как освоение терминала, настройка и эффективная работа в командной оболочке, управление версиями кода с помощью git , основы SQL, инструменты вроде Make , jq и регулярные выражения, основы сетевого взаимодействия, а также лучшие практики разработки программного обеспечения и совместной работы.

    Если интересно поучаствовать в проекте, подписывайтесь на список рассылки!

    Источник

    Оцените статью