Команда cat и прочие утилиты, которые я описывал ранее в статье “Обзор основных команд UNIX”, выводят на экран все содержимое текстового файла. Когда необходимо просматривать только определенные части файла, можно применять утилиты,предназначенные специально для извлечения текста. В следующих подразделах рассказывается о том, как использовать некоторые из таких важных утилит.
Применение grep для выполнения сопоставления по шаблону Команда grep уже вкратце описывалась ранее в моем блоге — она позволяет выполнять в файле поиск совпадений с определенным шаблоном с использованием регулярных выражений. (Хорошее учебное пособие по регулярным выражениям доступно по адресу http://www.regular-expressions.info/tutorial.html.) Слово “grep” является сокращением от “global regular expression print” (“глобальная печать с помощью регулярных выражений”) и происходит от следующей команды vi, которая распечатывает все строки, совпадающие с регулярным выражением re:
g/re/p
К регулярным выражениям можно относиться как к критериям поиска, применяемым для обнаружения текста в файле, и тогда команду grep можно считать похожей на применяемую в других операционных системах команду find. В частности, команда grep выполняет в каждой строке файла (или файлов) поиск первого вхождения заданной строки и если ей удается обнаружить такую строку, выводит ее на экран. Например,чтобы отобразить на экране только строки из файла test.txt, которые содержат словосочетание “oracle database”, можно использовать такую команду grep:
$ grep 'oracle database' test.txt
Чтобы отобразить на экране только строки из файла test.txt, которые не содержат словосочетания “oracle database”, нужно применить команду grep с параметром -v, как показано ниже:
$ grep -v 'oracle database' test.txt
Помимо параметра -v, с командой grep можно также использовать еще несколько других параметров:
- -c — для отображения количества обнаруженных совпадений в каждом входном файле;
- -l — для отображения имени каждого входного файла;
- -n — для отображения номера каждой выводимой строки.
- -i — для игнорирования регистра букв в выражении.
Помимо команды grep для выполнения поиска в файлах можно применять команду fgrep (fixed grep). Эта команда не подразумевает использования регулярных выражений. Она сравнивает строки напрямую, отыскивая совпадения с фиксированной строкой, а не с регулярным выражением.
Команда egrep, представляющая собой еще одну разновидность команды grep, имеет дело со сложными регулярным выражениями и работает быстрее обычной команды grep.
Вырезание, вставка и объединение текста
Часто бывает необходимо вырезать часть текста из файла или объединить вместе текст из нескольких файлов. В UNIX для решения этих задач предусмотрены замечательные команды, которые более подробно рассматриваются в следующих подразделах.
Вывод столбцов с помощью команды cut
Команда cut позволяет выводить на экран только определенные столбцы из текстового файла. Для примера создадим файл по имени example.txt, содержащий такой текст:
one two three four five six seven eight nine ten eleven twelve
Указывать поля, которые требуется извлечь, можно с помощью параметра -f. То есть извлечь из файла example.txt только второй столбец можно так:
$ cut -f2 example.txt two five eight eleven
Параметр -c позволяет указывать, какие конкретно символы требуется извлечь из файла. Например, первая из приведенных ниже команд показывает, как извлечь из файла password.txt только десятый символ, а вторая — как извлечь из него символы в диапазоне с 10 по 12:
$ password.txt | cut -c10 $ password.txt | cut -c10-12
Совместное использование параметров –d и –f позволяет извлечь символы вплоть до указанного разделителя. Например, в приведенной ниже команде cut параметр-f1 указывает, что из файла passwd требуется извлечь только первое поле, а параметр –d":" — что разделителем этого поля является символ двоеточия. (Файл passwd, находящийся в каталоге /etc, представляет собой место, в котором в системах UNIX и Linux хранится информация об учетных записях пользователей.)
$ cut -d":" -f1 /etc/passwd root daemon bin sys adm uucp mail
Объединение файлов с помощью команды paste
Команда paste берет одну строку из одного источника и объединяет ее с другой строкой из другого источника. Предположим, что имеется два файла: test1.txt, в котором содержится строка one two three, и test2.txt, в котором есть строка one four five six. Тогда для их объединения вместе можно применить такую команду paste:
$ paste test1.txt test2.txt one two three one four five six
Объединение файлов с помощью команды join
Команда join тоже позволяет объединять содержимое двух файлов, но работает только при наличии у объединяемых файлов общего поля. У файлов test1.txt и test2.txt из предыдущего раздела общего поля нет, поэтому выполнение команды join для них не приведет к получению каких-либо результатов. Однако предположим,что есть два других файла — test.one и test.two, содержимое которых выглядит следующим образом:
test.one test.two 11111 Dallas 11111 High Tech 22222 Houston 22222 Oil and Energy
По умолчанию команда join просматривает на предмет совпадения только первые поля, поэтому в случае ее применения для файлов test.one и test.two результат на основании их общего (первого) столбца будет выглядеть так:
$ join test.one test.two 11111 Dallas High Tech 22222 Houston Oil and Energy
С помощью параметра -1 можно указывать команде join, какое поле должно использоваться для сопоставления в первом файле, а с помощью параметра -2 — то же для второго файла. Например, если второе поле в первом файле сопоставляется с третьим полем во втором файле, команда join может выглядеть следующим образом:
$ join -1 2 -2 3 test.one test.two
Параметр –o позволяет указывать подлежащие выводу поля в формате файл.поле.То есть, чтобы распечатать второе поле первого файла и третье поле второго файла в совпадающих строках, можно применить команду join со следующими параметрами:
$ join -o 1.2 2.3 test.one test.two
Сортировка текста с помощью команды sort
Команда sort осуществляет сортировку строк текстовых файлов, передаваемых ей как из конвейера, так и из файла. В случае применения вместе с ней параметра –m она просто объединяет файлы, не сортируя их. Предположим, что имеется файл по имени test.txt, в котором содержатся следующие строки:
$ cat test.txt yyyy bbbb aaaa nnnn
Тогда с помощью команды sort можно отобразить содержимое этого файла в алфавитном порядке:
$ sort test.txt aaaa bbbb nnnn yyyy
По умолчанию команда sort выполняет сортировку по первому столбцу текста.
Удаление дублированных строк с помощью команды uniq
Команда uniq позволяет удалять дублированные строки из отсортированного файла. Она часто выполняется в конвейере следом за командой sort. В случае применения с ней параметра –c она может подсчитывать количество обнаруживаемых вхождений каждой строки, а в случае применения параметра –d — только сообщать о дублированных строках.
$ sort -m test.one test.two | uniq -c 1 New test. 2 Now testing 1 Only a test.
В приведенном выше примере команда sort объединяет два файла — test.one и test.two — из-за наличия параметра –m, после чего ее вывод по конвейеру передается команде uniq с параметром –c. В результате на экране отображается отсортированный в алфавитном порядке список без дублированных строк вместе с количеством вхождений для каждой строки.