Linux вывести первый столбец

Обновлено: 04.07.2024

Утилиты Linux часто повторяют принципы работы Unix. Инструменты стремятся к простоте, используют обычные текстовые файлы для ввода и вывода данных и работают по модульному принципу. Такое подражание также предоставляет огромные функциональные возможности обработки текста с помощью инструментов sed и awk.

Данное руководство описывает использование awk. Awk – это одновременно язык програмирования и текстовый процессор, предоставляющий несколько очень удобных способов обработки текстовых данных. Все примеры были выполнены на Ubuntu 12.04 VPS, но любая современная система Linux должна работать таким же образом.

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

Команда awk включена во все современные дистрибутивы Linux по умолчанию, ее не нужно устанавливать.

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

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

Базовый формат команды awk:

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

Если был пропущен шаблон, awk выполнит указанное действие для всех строк.

Если обе части были указаны, awk использует поисковый шаблон, чтобы вывести совпавшие с ним строки, а затем выполняет над этими строками указанное действие.

Основы работы с awk

В своей простейшей форме awk, как и cat, просто выводит все строки текстового файла на экран.

Для примера попробуйте вывести файл fstab, содержащий список существующих файловых систем:

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

Как видите, теперь awk вывела только строки, содержащие последовательность «UUID». Можно также избавиться от посторонних строк, указав, что последовательность «UUID» должна быть расположена в самом начале строки:

awk '/^UUID/' /etc/fstab
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1

Аналогичным образом можно использовать часть «действие», чтобы указать, какую именно информацию нужно вывести. К примеру, чтобы вывести только первый столбец, наберите:

awk '/^UUID/ ' /etc/fstab
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd

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

Встроенные переменные и расширенный формат awk

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

Список встроенных переменных awk:

  • FILENAME: ссылается на текущий входной файл.
  • FNR: Ссылается на номер текущей записи относительно текущего вводного файла. Например, если в данный момент открыто два вводных файла, команда выведет номер записи каждого из них.
  • FS: текущий разделитель полей, который используется для обозначения каждого поля в записи. По умолчанию установлен пробел.
  • NF: количество полей в текущей записию
  • NR: номер текущей записи.
  • OFS: разделитель полей для выводимых данных. По умолчанию установлен пробел.
  • ORS: разделитель записей для выводимых данных. По умолчанию установлен символ новой строки.
  • RS: разделитель записей, отделяющий записи во входном файле. По умолчанию это символ новой строки.

Значения этих переменных можно менять в соответствии с потребностями файлов. Обычно это делается во время инициализации обработки awk.

В целом, синтаксис awk немного более сложный, чем кажется сначала. Кроме того, он содержит дополнительные блоки BEGIN и END, которые могут содержать команды, которые нужно выполнить перед или после обработки файла соответственно.

Расширенный синтаксис выглядит примерно так:

Ключевые слова BEGIN и END, на самом деле, просто конкретные совокупности условий, так же, как и параметры поиска. Они совпадают до и после обработки документа.

Это значит, что некоторые переменные блока BEGIN можно изменить. К примеру, файл /etc/passwd разделён с помощью исмволов двоеточия (:), а не пробелов. Чтобы вывести первый столбец этого файла, можно использовать:

Блоки BEGIN и END можно использовать, чтобы получить простую информацию о выведенных полях:

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

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

awk 'BEGIN < print "We can use awk like the echo command"; >'
We can use awk like the echo command

Условные операторы и поиск по полям

В одном из приведенных выше примеров в файле /etc/fstab была найдена последовательность «UUID». Это было просто, так как нужно было найти строку, содержащую эту последовательность в начале.

Но что, если нужно найти последовательность, расположенную в начале поля?

Можно создать тестовый файл favorite_food.txt, содержащий пронумерованный список любимых продуктов группы друзей.

echo "1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan
5 spaghetti jessica" > favorite_food.txt

Чтобы вывести все слова, начинающиеся с «sa», используйте:

awk '/sa/' favorite_food.txt
1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan

В выведенном результате показаны не только слова, начинающиеся с последовательности «sa». Это касается слова «wasabi», которое содержит нужную последовательность в середине; кроме того, слово «sandy» также не совсем соответствует шаблону, так как находится в другом столбце. Нужно вывести только слова, которые начинаются с «sa» во втором столбце.

Чтобы сделать это, наберите:

/^sa/' favorite_food.txt
3 sandwich brian
4 salad ryan

Как видите, это работает должным образом.

Символ «^» говорит awk ограничить поиск началом поля. Часть «field_num

» указывает, что искать нужно только во втором столбце.

Вывести последовательности, которые не совпадают с шаблоном, можно при помощи символа «!», указанного перед тильдой (

). Данная команда выведет все строки, которые не начинаются с «sa».

/^sa/' favorite_food.txt
1 carrot sandy
2 wasabi luke
5 spaghetti jessica

Чтобы вывести строки, для которых верно предыдущее выражение и порядковый номер которых меньше 5, используйте условный оператор:

/^sa/ && $1 < 5' favorite_food.txt

Это выполняет несколько новых действий. Так, оператор && дает возможность задавать дополнительные требования. Таким образом можно объединить произвольное количество условий для поиска нужной строки.

Этот оператор используется для того, чтоб проверить, что значение первого столбца меньше, чем 5.

Заключение

Данное руководство дает общее представление о том, как awk может управлять, форматировать и выборочно выводить текстовые файлы. Тем не менее, работа с Awk – достаточно широкая тема, ведь на самом деле это целый язык программирования, дополненый функциями присвоения переменных, управляющими структурами, встроенными функциями и т.п. Его можно использовать для быстрого и удобного форматирования текста скриптов.

Получить больше информации о работе awk, а также ознакомиться с gawk, современной GNU-версией awk, можно на специальных онлайн-ресурсах.

Команда cut используется, если нужно вырезать часть текста — при этом он может находиться в файле либо быть напечатанным через стандартный ввод. В Unix-системах эта команда удаляет секции текста, которые были обозначены при помощи байтов, символов или полей, разделенных знаками "-" и ":". Работу cut обеспечивает одноименная утилита. Она входит в состав GNU Coreutils, так что по умолчанию доступна во всех дистрибутивах Linux. Также ею можно воспользоваться на машинах с операционной системой BSD.

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

Синтаксис команды cut

Написание команды cut выглядит следующим образом:

$ cut опции путь_к_файлу

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

Параметры cut

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

  • -b (--bytes=LIST) — номер байта, набор или диапазон байтов, подлежащих вырезанию.
  • -c (--characters=LIST) — символ, который следует вырезать. Также можно указывать набор либо диапазон символов.
  • -d (--delimiter=DELIM) — с помощью этой опции пользователь устанавливает свой разделитель вместо стандартного TAB.
  • -f (--fields=LIST) — перечень полей для вырезания.
  • -s (--only-delimited) — если была применена эта опция, cut не выводит строки, где нет разделителя.
  • --complement — задает байты, символы или поля, которые останутся в файле или тексте из стандартного ввода. Все остальное будет вырезано.
  • --output-delimiter=STRING — по умолчанию выходной разделитель соответствует входному. Эта опция позволяет задать другой выходной разделитель.
  • -z, --zero-terminated — вместо символа новой строки разделителем будет NULL.

Это основные параметры команды cut, которые нам понадобятся при работе с утилитой.

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

Прежде всего создадим файл cut_command_example.txt и поместим его в домашнюю директорию. В теле документа пропишем текст:

Winter: white: snow: frost
Spring: green: grass: warm
Summer: colorful: blossom: hot
Autumn: yellow: leaves: cool

1. Работа с байтами

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

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

echo "The sky was yellow as brass." | cut -b 1


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

echo "I looked at my watch; not eight o'clock." | cut -b 5,8,17


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


Теперь рассмотрим те варианты использования команды, где нужно вырезать символы из текста, который находится в файле. Стандартная запись в терминале выглядит так:

cut -b 1,9 cut_command_example.txt

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


Примерно так же работает вырезание символов в заданном диапазоне. Диапазон - это два числа, написанные через дефис:

cut -b 12-20 cut_command_example.txt


Команду cut можно использовать саму по себе, но не возбраняется сочетать с другими командами. Чаще всего используется sort. Попробуем вырезать первые 4 символа и расположить строки в алфавитном порядке:

cut -b 1-7 cut_command_example.txt | sort


Для сортировки по алфавиту команде sort не нужны дополнительные опции. А вот чтобы расположить строки в обратном порядке, следует добавить к записи -r:

cut -b 1-7 cut_command_example.txt | sort -r


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

cut -b 5- cut_command_example.txt

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

cut -b -25 cut_command_example.txt


Точно так же дефис используется, если текст задан не из файла, а через стандартный ввод:

echo "The pallid sunlight through the window shone upon my hands." | cut -b -35

echo "The pallid sunlight through the window shone upon my hands." | cut -b 35-


2. Работа с символами

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

echo "She offered to help me, but that was not allowed." | cut -c 1


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

echo "We worked till dusk, then washed and dressed." | cut -c 12,31,45


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

echo "The two cars were now racing side by side along the straight road." | cut -c 17-52


Нередко возникает необходимость вырезать часть текста из готового документа. Чтобы сделать это, достаточно выполнить команду

cut -c 18,25 cut_command_example.txt


Как видно на скриншоте, были вырезаны восемнадцатый и двадцать пятый символы в каждой из строк.

Если же вырезать только первый символ в каждой строке при помощи команды

cut -c 1 cut_command_example.txt

результат будет таким же, как и у команды

cat cut_command_example.txt | cut -c 1


Чтобы вырезать из текстового файла диапазон символов, нужно напечатать в терминале следующую команду:

cut -c 7-34 cut_command_example.txt


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

cut -c 1-9 cut_command_example.txt | sort


Расстановка символов в обратном порядке — начиная с конца алфавита — требует применения опции -r:

cut -c 1-9 cut_command_example.txt | sort -r

Уже известный нам трюк с дефисом возле числа можно повторить и в данном случае:

echo "We had had fights for the same reason before now." | cut -c 12-

Будет вырезана последовательность символов, начиная с двенадцатого и заканчивая последним в строке.


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

echo "We had had fights for the same reason before now." | cut -c -12


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

cut -c -8 cut_command_example.txt

Команда вырезает текст в каждой из строк, согласно заданным параметрам.


3. Работа со столбцами

Создавая файл cut_command_example.txt, мы отделяли слова друг от друга не только пробелами, но и двоеточиями. Наконец пришло время использовать эти знаки на практике. А нужны они для того, чтобы вырезать фрагменты текста из столбцов и называются разделителями. Кроме двоеточий и пробелов в качестве разделителей можно использовать дефисы.

Но начнем, как всегда, с текста в стандартном выводе. Чтобы вырезать слово из первого столбца, воспользуемся командой

echo "From the inn issued a smell of frying liver." | cut -d ' ' -f 1


В случае с текстовым файлом результат такой же — первое слово каждого столбца напечатано в терминале:

cut -d ':' -f 1 cut_command_example.txt


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

echo "He was extraordinarily particular about politeness in others." | cut -d ' ' -f 1,2,3

В данном примере ее результатом должны быть первые три слова — He was extraordinarily.


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

cut -d ':' -f 1,2,3 cut_command_example.txt


Из файла были вырезаны три первые столбца, а их содержимое выведено в терминал.

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

echo "Surprised, we looked at one another." | cut -d ' ' -f 1-5


Как и ожидалось, были вырезаны столбцы (слова) с первого по пятый. Обратите внимание на два апострофа, которые из раза в раз появляются в записи команды при работе с текстом из стандартного ввода. Эти знаки необходимы, если разделителем является символ пробела. Теперь вырежем диапазон полей из файла:

cut -d ':' -f 1-3 cut_command_example.txt

Точно так же, как раньше сортировали вырезанные символы, мы можем поступить и сейчас — расставить названия сезонов из файла в алфавитном порядке:

cut -d ':' -f 1 cut_command_example.txt | awk '' | sort


Меняя числовое значение опции -f, можно вырезать и сортировать содержимое других столбцов. Отсортировать названия сезонов в обратном порядке поможет опция -r, добавленная к команде sort:

cut -d ':' -f 1 cut_command_example.txt | awk '' | sort -r


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

echo "We became still more friendly." | cut -d ' ' -f 2-


Переместив дефис влево, мы сделаем этот столбец последним, а вырезать слова команда будет, начиная с первого столбца.

echo "We became still more friendly." | cut -d ' ' -f -2


Работа этой команды с текстовыми файлами не имеет принципиальных отличий:

cut -d ':' -f 2- cut_command_example.txt

cut -d ':' -f -2 cut_command_example.txt


Команда cut также пригодится при работе с массивными CSV-документами. Ее синтаксис и опции в этом случае остаются неизменными. Например, при таком написании будут вырезаны первые два столбца файла с названием file_example.csv:

cut -d ',' -f 1,2 file_example.csv

Выводы

Команда cut linux — это инструмент, который пригодится всем пользователям Linux, которые работают с большими текстовыми документами. Ее возможности поистине фантастические и она имеет немало преимуществ перед другими схожими утилитами.

Как всегда, не стесняйтесь задавать вопросы в комментариях, если какие-то аспекты работы этой команды остались непонятными для вас.

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

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

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

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

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

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

Файл 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 использует разделитель табуляции, но его можно изменить с помощью параметра -d .


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


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

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


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


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

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


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


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


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

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

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

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

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


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

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

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


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

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


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

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


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


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


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 выглядит следующим образом:


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


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


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


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


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


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

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

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

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

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

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


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


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


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

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


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

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

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

Извлечение 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 .

Чтобы заменить в нашем проекте все вхождения 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. Подсчитайте количество гласных в файле. Отсортируйте результат от наиболее распространённой до наименее распространённой буквы.

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


Утилита cut в Unix/Linux

Теперь, создайте файл use_cut.txt для выполнения дальнейших примеров с использованием утилиты cut, для примера:

Использования команды cut в Unix / Linux, чтобы напечатать символы определенной позиции.

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

Эта команда выведет 3-й и 7-й символ в каждой строке.

Использования команды cut в Unix / Linux, чтобы напечатать символы в определенном диапазоне.

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

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

Использования команды cut в Unix / Linux, чтобы вывести символы разделенные определенным разделителем.

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

Эта команда печатает второе и третье поле в каждой строке.

Использования команды cut в Unix / Linux, чтобы вывести символы определенного интервала для полей.

Вы можете напечатать диапазон полей, указав начальную и конечную позицию:

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

Чтобы показать строки начиная из 2-й строки до последнего поля, вы можете опустить последнюю позицию поля:

Использования команды cut в Unix / Linux, чтобы вывести первое поле из /etc/passwd файла.

В файле /etc/passwd поля разделены разделителем (:). С помощью команды cut можно вывести можно вывести первое поле в данном файле:

Преобразовать текст в обратном порядке (отобразить зеркально).

Для этого, используем следующую команду:

Читайте также: