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
Для эффективного использования всей вычислительной способности Вашего процессора существует утилита pigz
– https://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/.