При работе с файлами ОС оперирует “таблицей файловых дескрипроторов”. В таблице есть номер дескриптора и ассоциированный с ним файл.

При выполнени записи в файл на самом деле мы просим ОС записать данные в определённый дескриптор.

По умолчанию ОС создаёт 3 дескриптора для каждого процесса:

  • 0 - стандартный поток ввода
  • 1 - стандартный поток вывода
  • 2 - поток вывода ошибок

Эти потоки с точки зрения ОС на самом деле являются файлами. Ну или файло-подобными объектами.

Конечно, сам процесс может изменить данные потоки внутри себя на любое другое значение. (freopen).

А зачем нам это знать?

В своё время много данных хранилось как простые текстовые файлы без специального формата (не JSON, не XML….)z. Для обработки этой информации требовались инструменты, которые и были разработаны для ОС UNIX. Эти инструменты нацелены на то, чтобы облегчить обработку такой слабоструктуированной информации.

Перенапавления потока вывода

Для того, чтобы поток вывода команды был направлен в файл, необходимо после окочания команды написать > <имя файла>.

Все данные файла будут уничтожены.

Данный символ инструктурирует BASH открыть файл на запись и изменить поток вывода с вывода на экран пользователья на вывод в файл. С точки зрения программы ничего не изменилось, она продолжает использовать стандартные методы для записи *

С помощью символа > происходит перенаправление ТОЛЬКО стандартного покотока вывода. Поток вывода ошибок не перенаправляется!

Чтобы сохранить данные в файле и записать вывод приложения в конец файла воспользуйтесь >>.

Перенавпреление потока вывода ошибок

Для решения этой задачи необходимо явно указать поток, который вы хотите перенаправить: 2>. В этом случае перенаправление затронет ТОЛЬКО поток вывода ошибок.

А можно оба?

Можно: команда > output.txt 2>&1. Важно! Порядок перенаправления потоков важен. Т.е. Если сначала соединить поток вывода ошибок в 1 дескриптор, а потом перенаправить поток вывода в файл, то информация об ошибках будет выводиться на экран пользователя.

ОШИБКА: команда 2>&1 > output.txt.

Понятно, что запомнить это сложно, поэтому можно воспользоваться: &> и &>>, которые перенаправят все потоки вывода в 1 файл.

Можно избавиться от ошибок: команда 2> /dev/null.

Перенаправление потока ввода

Приложение cat

Данное приложение позволяет “соединять” несколько текстовых файлов в единый поток данных. Её можно использовать для слияния потоковых файлов.

С перенаправлением потока вывода cat может стать простейшим текстовым редактором: cat > file.txt

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

Использование pipes, пайпов

команда1 | команда2

Стандартный поток вывода команды 1 будет направлен на стандартный поток ввода команды 2. Не напрямую, а через буфер пайпа.

Приложения-фильтры

Приложение sort

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

Приложение uniq

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

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

abc
abc
def
abc
def
abc

Во втором примере uniq не найдёт повторения строк. Если вам интересы дубликаты без их порядка, т.е. когда порядок их появления в файле не важен, тогда можно поток ввода отсортировать: команда | sort | uniq | less.

Приложение wc

WC = Word Count

wc - позволяет подсчитать количество линий, слов, букв (байт) в потоке данных.

Приложение grep

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

Простеший способ запуска: grep [ПАРАМЕТРЫ] шаблон [ФАЙЛЫ]

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

Полезные опции:

  • -v - искать строки, которые не совпадают с шаблоном.
  • -i - искать без учёта регистра.

Приложение head/tail

Приложения head/tail позволяют посмотреть на начало или конец потока данных (файла)

Tail также позволяет следить за содержимым файла в реальном времени. Для этих целей используем флаг -f

Приложение tee

Данное приложение позволяет встать в поток ввода и реализовать его вывод или сохранене в зависимости от желания.