Обработка данных


Основы Linux

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

Существует огромное количество программ, которые опытные пользователи применяют для работы с данными. Каждая из них выполняет строго определённую функцию, следуя философии Unix: делать одно дело, но делать его хорошо.

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

  • sed для сложных манипуляций с текстом (использовали в модуле "Управление потоками")
  • tr посимвольное преобразование данных
  • head вывод первых строк
  • cut для извлечения частей строк
  • sort для сортировки данных

Приведённые ниже инструменты рекомендуем вам изучить самостоятельно:

  • awk для сложной обработки текста
  • less как интерактивный просмотрщик файлов
  • more для постраничного чтения файлов
  • paste для объединения файлов
  • tail обратный аналог изученного head
  • uniq для фильтрации повторяющихся строк в потоке

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

В простейшем случае tr заменяет символ, указанный в первом аргументе, на символ из второго аргумента:

hacker@data:~$ echo OTF | tr O C
CTF
hacker@data:~$

Команда также поддерживает замену нескольких символов одновременно: каждый символ на позиции N в первом аргументе заменяется символом на позиции N во втором аргументе.

hacker@data:~$ echo CTM.SCHOOA | tr MA FL
CTF.SCHOOL
hacker@data:~$

Выполните следующее задание:

Программа /challenge/run выводит флаг, в котором регистр всех букв инвертирован: заглавные буквы заменены строчными и наоборот (например, A становится a). Используйте tr, чтобы восстановить исходный регистр и получить флаг.

ПОДСКАЗКА:
Для упрощения задачи используте знания о джокере [] из модуля модуле "Linux глоббинг".

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Команда tr также позволяет удалять символы из потока данных. Для этого используется флаг -d с аргументом, перечисляющим символы, подлежащие удалению:

hacker@data:~$ echo CATF | tr -d A
CTF
hacker@data:~$

Выполните следующее задание. Программа /challenge/run выводит флаг, в который вставлены посторонние символы (^ и %). Удалите их с помощью команды tr -d.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Распространённая задача при обработке данных — удаление символов перевода строки. Это необходимо в тех случаях, когда поток данных требуется преобразовать в одну строку для последующей обработки. Символ перевода строки задаётся с помощью экранирования, вот пример:

hacker@data:~$ echo "hello_world!" | tr _ "\n"
hello
world!
hacker@data:~$

Обратная косая черта (\) признак экранирования: она указывает командной оболочке, что следующий за ней символ имеет специальное значение. Так, символ перевода строки обозначается последовательностью \n, где n происходит от new line. Ввести этот символ перевода строки в командной строке напрямую невозможно: нажатие клавиши Enter не вставляет перевод строки, а инициирует выполнение команды. Поэтому последовательность \n необходимо заключать в кавычки — в противном случае командная оболочка попытается интерпретировать её самостоятельно, не передав в tr.

ПРИМЕЧАНИЕ:
Для замены самой обратной косой черты (\) необходимо её экранировать: последовательность \\ будет воспринята командой tr как один символ \. К данному заданию это не относится, однако данное правило полезно знать.


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

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

В работе с Linux нередко возникает необходимость получить лишь начальную часть вывода многословных программ. Для этой цели предназначена команда head. Она выводит первые несколько строк переданных ей данных:

hacker@data:~$ cat /something/very/long | head
this
is
just
the
first
ten
lines
of
the
file
hacker@data:~$

По умолчанию команда выводит первые 10 строк. Количество строк задаётся параметром -n:

hacker@data:~$ cat /something/very/long | head -n 2
this
is
hacker@data:~$

Попробуйте команду head на практке.


В задании программа /challenge/ctf выводит большой объём данных. Вам необходимо передать её вывод через head, ограничив его первыми 7 строками, а затем направить результат в /challenge/school. Программа /challenge/school выдаст флаг при условии, что входные данные сформированы верно.

ПОДСКАЗКА:
Решение представляет собой составную команду с двумя операторами конвейера, соединяющими три утилиты.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

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

Рассмотрим следующий пример файла с данными:

hacker@data:~$ cat scores.txt
hacker 70 80 90
root 92 43 89
hacker@data:~$

С помощью cut можно извлечь нужные столбцы:

hacker@data:~$ cut -d " " -f 1 scores.txt
hacker
root
hacker@data:~$ cut -d " " -f 2 scores.txt
70
92
hacker@data:~$ cut -d " " -f 3 scores.txt
80
43
hacker@data:~$

Разберем используемые параметры:

  • Параметр -d задаёт разделитель (delimiter) столбцов — символ, которым отделяются поля друг от друга. В приведённом примере разделителем служит пробел. Его необходимо заключать в кавычки, чтобы командная оболочка воспринимала его как аргумент, а не как пробел между аргументами.

  • Параметр -f указывает номер извлекаемого поля (столбца).


В данном задании программа /challenge/run выводит строки, в которых каждому символу флага предшествует случайное число. Используйте cut для извлечения символов флага, а затем передайте результат в tr -d "\n" (по аналогии с предыдущим заданием), чтобы объединить символы в одну строку.

ПОДСКАЗКА:
Команда будет иметь вид /challenge/run | cut ??? | tr ???, где вместо ??? необходимо подставить нужные аргументы.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

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

hacker@data:~$ cat names.txt
  hack
  the
  planet
  with
  ctf
  school
hacker@data:~$ sort names.txt
  ctf
  hack
  planet
  school
  the
  with
hacker@data:~$

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

  • -r — обратный порядок сортировки (от Я до А)
  • -n — числовая сортировка
  • -u — вывод только уникальных строк (с удалением дубликатов)
  • -R — случайный порядок

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


В данном задании файл /tmp/flags.txt содержит 100 ложных флагов, среди которых скрыт один настоящий. При алфавитной сортировке настоящий флаг окажется последним в списке — это было учтено при генерации ложных флагов. Извлеките его!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college