Linux работа с текстовыми файлами

Сортирует содержимое файла, часто используется как промежуточный фильтр в конвейерах. Эта команда сортирует поток текста в порядке убывания или возрастания, в зависимости от заданных опций. Ключ -m используется для сортировки и объединения входных файлов. В странице info перечислено большое количество возможных вариантов ключей. См. Пример 10-9, Пример 10-10 и Пример A-9.

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

Удаляет повторяющиеся строки из отсортированного файла. Эту команду часто можно встретить в конвейере с командой sort.

Ключ -c выводит количество повторяющихся строк.

Команда sort INPUTFILE | uniq -c | sort -nr выводит статистику встречаемости строк в файле INPUTFILE (ключ -nr, в команде sort, означает сортировку в порядке убывания). Этот шаблон может с успехом использоваться при анализе файлов системного журнала, словарей и везде, где необходимо проанализировать лексическую структуру документа.

Пример 12-8. Частота встречаемости отдельных слов

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

Команда unexpand преобразует пробелы в символы табуляции. Т.е. она является обратной по отношению к команде expand.

Предназначена для извлечения отдельных полей из текстовых файлов. Напоминает команду print $N в awk, но более ограничена в своих возможностях. В простейших случаях может быть неплохой заменой awk в сценариях. Особую значимость, для команды cut, представляют ключи -d (разделитель полей) и -f (номер(а) поля(ей)).

Использование команды cut для получения списка смонтированных файловых систем:

Использование команды cut для получения версии ОС и ядра:

Использование команды cut для извлечения заголовков сообщений из электронных писем:

Использование команды cut при разборе текстового файла:

cut -d ‘ ‘ -f2,3 filename эквивалентно awk -F'[ ]’ ‘< print $2, $3 >’ filename

Используется для объединения нескольких файлов в один многоколоночный файл.

Может рассматриваться как команда, родственная команде paste. Эта мощная утилита позволяет объединять два файла по общему полю, что представляет собой упрощенную версию реляционной базы данных.

Команда join оперирует только двумя файлами и объедияет только те строки, которые имеют общее поле (обычно числовое), результат объединения выводится на stdout. Объединяемые файлы должны быть отсортированы по ключевому полю.

На выходе ключевое поле встречается только один раз.

Выводит начальные строки из файла на stdout (по-умолчанию — 10 строк, но это число можно задать иным). Эта команда имеет ряд интересных ключей.

Пример 12-9. Какие из файлов являются сценариями?

Пример 12-10. Генератор 10-значных случайных чисел

Выводит последние строки из файла на stdout (по-умолчанию — 10 строк). Обычно используется для мониторинга системных журналов. Ключ -f, позволяет вести непрерывное наблюдение за добавляемыми строками в файл.

Пример 12-11. Мониторинг системного журнала с помощью tail

Многоцелевая поисковая утилита, использующая регулярные выражения. Изначально это была команда в древнем строчном редакторе ed, g/re/p, что означает — global – regular expression – print .

Поиск участков текста в файле(ах), соответствующих шаблону pattern, где pattern может быть как обычной строкой, так и регулярным выражением.

Если файл(ы) для поиска не задан, то команда grep работает как фильтр для устройства stdout, например в конвейере.

-i — выполняется поиск без учета регистра символов.

-w — поиск совпадений целого слова.

-l — вывод только имен файлов, в которых найдены участки, совпадающие с заданным образцом/шаблоном, без вывода совпадающих строк.

-r — (рекурсивный поиск) поиск выполняется в текущем каталоге и всех вложенных подкаталогах.

The -n option lists the matching lines, together with line numbers.

-v (или –invert-match) — выводит только строки, не содержащие совпадений.

-c ( –count) — выводит количество совпадений без вывода самих совпадений.

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

Для того, чтобы заставить grep выводить имя файла, когда поиск производится по одному-единственному файлу, достаточно указать устройство /dev/null в качестве второго файла.

Если совпадение было найдено, то grep возвращает код завершения — 0, это может оказаться полезным при выполнении поиска в условных операторах ( в таких случаях особый интерес может представлять ключ -q, который подавляет вывод).

Пример 29-6 — пример поиска заданного образца в системном журнале, с помощью grep.

Пример 12-12. Сценарий-эмулятор "grep"

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

fgrep — то же самое, что и grep -F. Эта команда выполняет поиск строк символов (не регулярных выражений), что несколько увеличивает скорость поиска.

Утилита agrep имеет более широкие возможности поиска приблизительных совпадений. Образец поиска может отличаться от найденной строки на указанное число символов.

Для поиска по сжатым файлам следует использовать утилиты zgrep, zegrep или zfgrep. Они с успехом могут использоваться и для не сжатых файлов, но в этом случае они уступают в скорости обычным grep, egrep и fgrep. Они очень удобны при выполнении поиска по смешенному набору файлов — когда одни файлы сжаты, а другие нет.

Для поиска по bzip-файлам используйте bzgrep.

Команда look очень похожа на grep, и предназначена для поиска по "словарям" — отсортированным файлам. По-умолчанию, поиск выполняется в файле /usr/dict/words, но может быть указан и другой словарь.

Пример 12-13. Поиск слов в словаре

Скриптовые языки, специально разработанные для анализа текстовых данных.

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

Утилита контекстного поиска и преобразования текста, замечательный инструмент для извлечения и/или обработки полей (колонок) в структурированных текстовых файлах. Синтаксис awk напоминает язык C.

wc — "word count" , счетчик слов в файле или в потоке:

wc -w подсчитывает только слова.

wc -l подсчитывает только строки.

wc -c подсчитывает только символы.

wc -L возвращает длину наибольшей строки.

Подсчет количества .txt -файлов в текущем каталоге с помощью wc:

Подсчет общего размера файлов, чьи имена начинаются с символов, в диапазоне d – h

От переводчика: в случае, если у вас локаль отлична от "C", то вышеприведенная команда может не дать результата, поскольку wc вернет не слово "total", в конце вывода, а "итого". Тогда можно попробовать несколько измененный вариант:

Использование wc для подсчета количества вхождений слова "Linux" в основной исходный файл с текстом этого руководства.

Отдельные команды располагают функциональностью wc в виде своих ключей.

Замена одних символов на другие.

Читайте также:  Где можно спокойно почитать в москве

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

Команда tr "A-Z" "*" tr A-Z * filename на звездочки (вывод производится на stdout). В некоторых системах этот вариант может оказаться неработоспособным, тогда попробуйте tr A-Z ‘[**]’.

Ключ -d удаляет символы из заданного диапазона.

Ключ –squeeze-repeats ( -s) удалит все повторяющиеся последовательности символов. Может использоваться для удаления лишних пробельных символов.

Ключ -c "complement" заменит символы в соответствии с шаблоном. Этот ключ воздействует только на те символы, которые НЕ соответствуют заданному шаблону.

Обратите внимание: команда tr корректно распознает символьные классы POSIX. [1]

Пример 12-14. toupper: Преобразование символов в верхний регистр.

Пример 12-15. lowercase: Изменение имен всех файлов в текущем каталоге в нижний регистр.

Пример 12-16. du: Преобразование текстового файла из формата DOS в формат UNIX.

Пример 12-17. rot13: Сверхслабое шифрование по алгоритму rot13.

Пример 12-18. Более "сложный" шифр

Различные версии tr

Утилита tr имеет две, исторически сложившиеся, версии. BSD-версия не использует квадратные скобки ( tr a-z A-Z), в то время как SysV-версия использует их ( tr ‘[a-z]’ ‘[A-Z]’). GNU-версия утилиты tr напоминает версию BSD, но диапазоны символов обязательно должны заключаться в квадратные скобки.

Выравнивает текст по ширине, разрывая, если это необходимо, слова. Особый интерес представляет ключ -s, который производит перенос строк по пробелам, стараясь не разрывать слова. (см. Пример 12-19 и Пример A-2).

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

Пример 12-19. Отформатированный список файлов.

Очень мощной альтернативой утилите fmt, является утилита par (автор Kamil Toman), которую вы сможете найти на http://www.cs.berkeley.edu/

Эта утилита с обманчивым названием удаляет из входного потока символы обратной подачи бумаги (код ESC 7). Она так же пытается заменить пробелы на табуляции. Основная область применения утилиты col — фильтрация вывода отдельных утилит обработки текста, таких как groff и tbl.

Форматирование по столбцам. Эта утилита преобразует текст, например какой либо список, в табличное, более "удобочитаемое" , представление, вставляя символы табуляции по мере необходимости.

Пример 12-20. Пример форматирования списка файлов в каталоге

Утилита удаления колонок. Удаляет колонки (столбцы) сиволов из файла и выводит результат на stdout. colrm 2 4 filename.

Если файл содержит символы табуляции или непечатаемые символы, то результат может получиться самым неожиданным. В таких случаях, как правило, утилиту colrm, в конвейере, окружают командами expand и unexpand.

Нумерует строки в файле. nl filename — выведет файл filename на stdout, и в начале каждой строки вставит ее порядковый номер, счет начинается с первой непустой строки. Если файл не указывается, то принимается ввод со stdin.

Вывод команды nl очень напоминает cat -n, однако, по-умолчанию nl не нумерует пустые строки.

Пример 12-21. nl: Самонумерующийся сценарий.

Подготовка файла к печати. Утилита производит разбивку файла на страницы, приводя его в вид пригодный для печати или для вывода на экран. Разнообразные ключи позволяют выполнять различные манипуляции над строками и колонками, соединять строки, устанавливать поля, нумеровать строки, добавлять колонтитулы и многое, многое другое. Утилита pr соединяет в себе функциональность таких команд, как nl, paste, fold, column и expand.

pr -o 5 –w >fileZZZ.

Хочу особо отметить ключ -d, который выводит строки с двойным интервалом (тот же эффект, что и sed -G).

GNU утилита, предназначена для нужд локализации и перевода сообщений программ, выводимых на экран, на язык пользователя. Не смотря на то, что это актуально, прежде всего, для программ на языке C, тем не менее gettext с успехом может использоваться в сценариях командной оболочки для тех же целей. См. info page.

Утилита преобразования текста из одной кодировки в другую. В основном используется для нужд локализации.

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

TeX и Postscript — языки разметки текста, используемые для подготовки текста к печати или выводу на экран.

TeX — это сложная система подготовки к печати, разработанная Дональдом Кнутом (Donald Knuth). Эту утилиту удобнее использовать внутри сценария, чем в командной строке, поскольку в сценарии проще один раз записать все необходимые параметры, передаваемые утилите, для получения необходимого результата.

Ghostscript ( gs) — это GPL-версия интерпретатора Postscript.

groff — это еще один язык разметки текста и форматированного вывода. Является расширенной GNU-версией пакета roff/troff в UNIX-системах.

tbl — утилита обработки таблиц, должна рассматриваться как составная часть groff, так как ее задачей является преобразование таблиц в команды groff.

eqn — утилита преобразования математических выражений в команды groff.

lex — утилита лексического разбора текста. В Linux-системах заменена на свободно распространяемую утилиту flex.

yacc — утилита для создания синтаксических анализаторов, на основе набора грамматик, задаваемых разработчиком. В Linux-системах, эта утилита заменена на свободно распространяемую утилиту bison.

Примечания

Это верно только для GNU-версии команды tr, поведение этой команды, в коммерческих UNIX-системах, может несколько отличаться.

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

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

Кодовая страница (англ. code page) определяет набор символов того или иного имеющего письменность языка, в котором каждый символ обычно кодируется одним или несколькими байтами. В сленге операторов компьютеров кодовые страницы обычно обозначают кратким термином – кодировка. На текущий момент развития вычислительной техники кодовые страницы существуют почти для всех языков мира на разных платформах и для различных операционных систем, кроме этого существуют универсальные кодовые страницы – Юникод – наборы, содержащие символы практически всех имеющих письменность языков нашего мира. Таким образом, если текстовый файл закодирован с определённой кодовой страницей, то и раскодирован он может быть с этой же кодовой страницей.

От теории перейдём к практическим основам. Для этой демонстрации в моём распоряжении имеется компьютер с установленным Debian buster, на примере которого я и покажу работу с текстовыми файлами в терминале.

Терминал Linux имеет несколько характерных свойств, на всех я останавливаться не буду, упомяну только одно наиболее важное для этой демонстрации – локаль. Локаль терминала определяет языковые признаки и особенности отображения в терминале той или иной информации: язык терминала, кодовую страницу терминала, формат отображения времени, денежных единиц, номеров телефонов и так далее. Установленную на вашем терминале локаль можно увидеть при помощи программы locale из пакета libc-bin. Этот пакет как правило установлен по умолчанию даже в самом минимальном наборе. Выхлоп locale выглядит следующим образом:

На снимке экрана моего терминала видно, что в моей системе установлена локаль ru_RU.UTF-8 . В этом обозначении содержится два элемента:

  • язык терминала – ru_RU ;
  • кодовая страница терминала – UTF-8 .

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

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

  • при помощи текстовых редакторов, таких как Nano, Vim, Emacs etc.;
  • посредством перенаправления стандартного потока вывода консольных программ в файл.

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

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

После ввода текста файл можно сохранить сочетанием ctrl+o .

Когда работа с текстом закончена, покинуть текстовый редактор можно сочетанием ctrl+x . В результате в текущем каталоге появился новый текстовый файл с именем example.txt. Содержимое этого файла очень просто вывести на экран терминала, для это можно воспользоваться программой cat или less , последняя позволяет при помощи клавиш со стрелками прокручивать текст, если он не умещается в окне терминала.

Сложностей с выводом содержимого созданного в терминале текстового файла не возникло, потому что кодировка файла и кодировка локали терминала совпадают.

В Linux текстовые файлы не обязательно имеют расширение, и расширение не определяет тип файла, тип файла определяется по содержимому. Чтобы посмотреть тип файла, существует программа file – именно она подскажет, что конкретный файл является, или не является текстовым.

Как видно, тип созданного в текстовом редакторе файла определился как UTF-8 Unicode text . Но не стоит обольщаться, программа file правильно определяет только некоторые кодировки, не все. В данном случае файл содержит символы русского алфавита, поэтому file показал Unicode. Если создать файл на основе только латинских символов, то кодировка определится как ASCII. Создам такой файл посредством перенаправления стандартного потока вывода программы echo.

Посмотрим на полученный файл.

Как видно, с отображением такого файла проблем тоже не возникло. Дело в том, что кодовая страница UTF-8 содержит все символы кодовой страницы ASCII, а коды этих символов в обоих кодовых страницах полностью совпадают.

Но жизнь не всегда однообразна, и очень часто оператору компьютера приходится иметь дело с текстовыми файлами созданными на других системах с использованием других кодовых страниц. У меня есть два характерных примера: текстовые файлы из набора CDDA-рипа, созданного программой Exact Audio Copy в операционной системе MS Windows.

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

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

Если со вторым файлом всё не так фатально, то с первым адекватной работы не получится совсем. Как быть? Ответ довольно прост. Оба файла можно очень легко перекодировать в кодировку локали моего терминала и работать с такой копией. Для достижения задуманного потребуется правильно определить кодировку исходного файла. Это поможет сделать универсальный детектор кодировки – uchardet. Программа имеется в официальном репозитории Debian, её можно установить при помощи пакетного менеджера.

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

Точно зная кодовую страницу исходного файла, его можно перекодировать, задав новую кодовую страницу для копии. С этой задачей мне поможет справиться программа iconv из уже упомянутого выше пакета libc-bin.

Как любая терминальная программа, iconv имеет элементарную справку, которую можно посмотреть с ключом –help .

Использование программы не представляет трудностей, в вызове достаточно указать кодировку исходного файла (ключ -f ), кодировку файла-копии (ключ -t ), имя файла-копии (ключ -o ) и имя исходного файла. Для файла sample.cue команда перекодирования будет иметь следующий вид.

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

Второй файл перекодируется также просто.

Список имён известных iconv кодовых страниц можно увидеть при помощи ключа -l .

При использовании iconv следует учитывать, что не все кодовые страницы могут быть преобразованы в конкретные кодовые страницы, например файл в кодировке WINDOWS-1251 можно перекодировать в любой Юникод, но при этом невозможно перекодировать в WINDOWS-1255.

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

Редактор Vi — универсальный полноэкранный текстовый редактор в среде UNIX.

  • 1. Команда cat — простой способ создавать текстовые файлы и выводить их на экран. Изначально нужна для объединения нескольких файлов.
  • 2. Теперь создадим файл при помощи текстового редактора vi. Это очень мощный редактор # vi file2. txt Теперь нажимаем клавишу чтобы выйти из режима вставки текста и вводим команду :wq чтобы записать файл на диск (w) и выйти (q)
  • 3. Объединяем эти файлы по общему ключу. Для объединения файлов служит команда join, которая по умолчанию принимает первые столбцы за ключевые , поэтому просто выполняем команду: # join file<1,2>. txt или (одинаково) # join file1. txt file2. txt

Как видим, файлы объединились в один, по общему ключу с электронной почтой. 4. Теперь представим, что у нас есть полный вывод, но нужны не все столбцы! На помощь придет команда cut. Скормим вывод предыдущей команды на ввод cut и укажем разделитель (-d» «) — пробел и перечислим поля (-f) которые нам нужны, в данном случае 2, 3 и 4-ое поля. # join file<1,2>. txt | cut -d" " -f2,3,4 5. При помощи echo до записать в каждый файл по паре записей. Здесь ОЧЕНЬ важно обратить внимание на один нюанс. Команда echo выводит строку на устройство вывода. По умолчанию это экран. Можно ей указать не экран, а файл, и тогда строка запишется в этот файл. Если просто указать перенаправление >, то эта строка заменит содержимое файла. А если двойное — >> , то строка дозапишется в конец. Нам нужно именно двойное. # echo bbb@mail. ru Sergey Kalinin >> file1. txt

Запуск редактора VI

Для уяснения всех концепций редактора Vi запустим его и создадим новый файл по имени test:

"test" [New file]

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

Редактор Vi сейчас находится в командном режиме. Нажмём клавишу i, и редактор перейдёт в режим ввода текста. Теперь вводим, например, следующий текст:

Многие пользователи предпочитают наделенный сказками редактор Emacs.

Введите любое количество строк, после каждой нажимая клавишу Enter. Исправлять опечатки можно с помощью клавиши Backspace. Для выхода из режима ввода и возвращения в командный режим нажмём клавишу Esc. Команда a начинает вставлять текст после текущего положения курсора, а не прямо в текущую. Для введения текста со следующей строки, используем команду o. Нажмём эту клавишу и введём одну-две строки текста.

В командном режиме каждое нажатие клавиши x удаляет символ, на который указывает курсор. Можно удалять целые строки командой dd (т. е. нажав клавишу d два раза подряд). Для удаления слова, на которое показывает курсор, можно использовать команду dw.

Команда 0 (клавиша ноль) перемещает курсор на начало текущей строки, а команда $ перемещает курсор в её конец. Для перемещения курсора в конец файла, используется команда G, а команда 10G, например, поместит курсор на строку с номером 10. Для выхода из редактора Vi без сохранения изменений, сделанных в файле, используется команда :q! Для выхода из редактора Vi с сохранением сделанных изменений используется команда :wq. Чтобы сохранить файл, но не выходить из редактора Vi, используется команда :w.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector