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

debianeach

Опубликован:  2019-05-15T08:06:58.911442Z

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

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

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

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

zvSEBAdHiy.png

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

wc2XcyxC1S.png

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

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

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

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

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

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

nano example.txt

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

9yoTiPtd63.png

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

BtmIA0LrIt.png

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

cat example.txt

aNWPKWdghZ.png

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

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

file example.txt

3Gl8lSlxSF.png

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

echo 'Hello, world!' > latin.txt

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

cat latin.txt

sc8lFg62b3.png

file latin.txt

FvGmJHMqgX.png

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

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

3ppyloZPfH.png

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

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

q9y0VuikIM.png

grJqcmubnD.png

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

sudo apt install uchardet

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

qI0SNJ7xxE.png

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

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

iconv --help

F4R4mxKeRh.png

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

iconv -f WINDOWS-1251 -t UTF-8 -o sample.utf8.cue sample.cue 

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

yYDzVAGmVn.png

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

iconv -f UTF-16 -t UTF-8 -o sample.utf8.log sample.log

e9xMqipr5L.png

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

iconv -l

ORoboCWHEX.png

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

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

Комментарии: