Ваша команда Linux объединяет множество функций в одном конвейере.
Несмотря на отсутствие усилий для самостоятельного решения проблемы, создание эквивалентной команды PowerShell - интересное упражнение по контрасту
Unix-утилиты с решением PowerShell :
Чтобы установить сцену, позвольте мне объяснить, что делает ваша команда:
grep Ban /var/log/fail2ban.log
с учетом регистра находит строки, содержащие слово Ban
в файле /var/log/fail2ban.log
, и пропускает только те, которые включены.
grep -v 'Restore Ban'
далее (с учетом регистра) отфильтровывает (-v
) строки, содержащие фразу «Запрет на восстановление».
sed 's/\s\s*/ /g'
заменяет все (g
) серии из 1 или более пробелов. (\s
; в современном диалекте регулярных выражений вы используете \s+
) с одним пробелом ...
... который затем позволяет cut -d" " -f8
надежно извлекать восьмое поле из каждой строки из результирующего списка, разделенного пробелами (например, 2*8.1*7.1*9.2*9
).
sort
затем лексически сортирует результирующие строки и uniq -c
отсеивает дубликаты, добавляя каждую уникальную строку с счетчиком дубликатов (-c
) с 1
с указанием уникальной строки.
Наконец, sort -t ' ' -n -b
сортирует результирующие строки численно по количеству дубликатов.
Вкратце: ваша команда фильтрует файл журнала с помощью сопоставления с регулярным выражением, извлекает 8-е поле из каждой строки, удаляет дубликаты и печатает уникальные поля с префиксом по количеству дубликатов, отсортированные по количеству дубликатов в порядке возрастания.
Ниже приведена почти эквивалентная команда PowerShell , которая:
более читабельно (и, следовательно, по необходимости, более многословно)
включает меньше шагов
в конечном итоге обеспечивает гораздо большую гибкость благодаря:
- отправка объектов по конвейеру, а не просто text , который часто нужно (пере) анализировать - именно эта функция составляет эволюционный квантовый скачок PowerShell по сравнению с традиционными оболочками.
- намного превосходящие языковые возможности (по сравнению с POSIX-подобными оболочками, такими как
bash
), которые можно легко вплетать в конвейер.
При этом цена, которую вы платите за увеличение мощности, составляет производительность :
- Команды прямого сопоставления работают намного лучше, используя утилиты Unix, хотя обычно более высокий уровень абстракции и гибкость, предоставляемые командлетами PowerShell, могут восполнить это.
Вот команда с примерно соответствующими вызовами Unix-утилит в комментариях:
Select-String -CaseSensitive '(?<!Restore )Ban' /var/log/fail2ban.log | #grep,grep -v
ForEach-Object { (-split $_.Line)[7] } | # sed, cut -f8
Group-Object | # uniq -c
Select-Object Count, Name | # construction of output *objects*
Sort-Object Count, Name # sort, sort -n
Команда выводит объекты со свойством .Count
(повторяющееся число) и .Name
(восьмое поле из файла журнала), которое:
- допускает надежную дополнительную обработку (синтаксический анализ текстового вывода не требуется).
- дружественно рендерится на консоль (см. Ниже).
Пример вывода:
Count Name
----- ----
8 1*2.2*6.1*1.1*5
12 3*.1*.*4.*6
18 1*5.2*8.2*5.4
19 1*2.2*6.1*1.1*4
72 3*.1*6.2*.9*
Для объяснения команды обратитесь к следующим разделам справки , которые также доступны локально, как часть установки PowerShell, с помощью командлета Get-Help