2  Импорт и предобработка данных

2.1 Работа с данными из командной строки Linux

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

FISH – продвинутая консоль

Если командным интерпретатором планируется пользоваться регулярно, то стоит позаботиться о собственном комфорте и технической эстетике :)

Установим альтернативный теримнал Fish

▶️ На Ubuntu и Debian-based дистрибутивах это делается так:

sudo apt install fish

Если желания менять терминал по-умолчанию для нашего пользователя нет, а хочется временно поработать в fish, можно просто набрать в терминале (например в bash)

fish

▶️ Если хотим поменять во-всей системе, то выполняем следующие шаги:

Смотрим куда установился наш fish, запоминаем путь

which fish

Например, у нас получилось /usr/bin/fish

▶️ Меняем для нашего пользователя терминал по-умолчанию, подставляя полученный путь в параметр --shell:

sudo usermod --shell=/usr/bin/fish $USER

❕Кроме того, если мы пользуемся эмулятором терминала, например Konsole в KDE, то достаточно поменять в настройках профиля Konsole пункт “Команда” на путь к fish – например, /usr/bin/fish.

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

В консоли fish как и во всех других консолях Linux существуют операторы управления выводом программ. Например, для просмотра файла сделаем:

cat /etc/passwd

▶️ Если вывод команды мы хотим сохранить в отдельный файл, то сделать это можно используя оператор >:

cat /etc/passwd > myfile.txt

Данная команда сохранит вывод команды cat /etc/passwd в файл myfile.txt.

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

▶️ Если мы хотим дописать в конец файла, то используем оператор >>:

cat /etc/passwd >> myfile.txt

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

▶️ Если вывод одной команды или программы мы хотим передать на вход другой программе, то используем оператор |:

cat /etc/passwd | grep root 

Просмотр первых и последних строк файла

▶️ Для просмотра начала файла используется команда head, а для просмотра конца файла, соответственно, tail.

Например:

head /etc/passwd
tail /var/log/syslog

или с использованием пайпа:

cat /etc/passwd | head
cat /var/log/syslog | tail

Параметр -n позволяет управлять количеством отображаемых строк:

cat /var/log/syslog | tail -n 20

▶️ Иногда, в ходе мониторинга определенных событий в логах, существует необходимость on-line отображения и анализа логов по мере их поступления. Тогда для команды tail можно использовать параметр -f:

tail -f /var/log/syslog 

PIGZ – многопроцессорная работа c архивами tar.gz

Для эффективного использования всей вычислительной способности Вашего процессора существует утилита pigzhttps://www.zlib.net/pigz/.

▶️ Утилита устанавливается из официального репозитория Ubuntu:

sudo apt install pigz

▶️ Теперь, у нас появляется возможность “на лету” просматривать и искать информацию в заархивированных текстовых данных. Например:

wget https://zenodo.org/record/5199540/files/ALLFLOWMETER_HIKARI2021.csv.zip

cat ./ALLFLOWMETER_HIKARI2021.csv.zip | pigz -dc | head 

JQ – работа с форматом JSON

Для работы с форматом JSON существует утилита jq. Устанавливается из репозитория:

sudo apt install jq

▶️ Скачаем пример данных в JSON формате и посмотрим:

wget https://github.com/OTRF/Security-Datasets/blob/2c2ac935c925930d009e44179a258b5579a6bbcf/datasets/atomic/windows/defense_evasion/host/cmd_disable_eventlog_service_startuptype_modification_via_registry.zip

cat ./cmd_disable_eventlog_service_startuptype_modification_via_registry.zip | pigz -dc | jq | head

▶️ К данным можно отправлять запросы – найдем все объекты, для которых поле EventID не равно значению 4103:

cat ./cmd_disable_eventlog_service_startuptype_modification_via_registry.zip | pigz -dc | jq 'select(.EventID != "4103")'

▶️ Поля результирующего JSON можно отсортировать, используя флаг -S:

cat ./cmd_disable_eventlog_service_startuptype_modification_via_registry.zip | pigz -dc | jq -S 'select(.EventID != "4103")'

▶️ Также можно сгенерировать новый JSON только с нужными для анализа полями, например “EventID”, “Level” и “Hostname”:

cat ./cmd_disable_eventlog_service_startuptype_modification_via_registry.zip | pigz -dc | jq -S '{ "EventID", "Level", "Hostname"}'

📌 Полная документация к инструменту – https://stedolan.github.io/jq/manual/.