"Unix shell" - подобный скрипту под Windows

Мне нужна помощь от гуру сценариев оболочки.

У меня есть файл .txt (журнал), который отслеживает IP-адреса клиентов в нескольких строках в формате, аналогичном этому:

Line1 - Client IP [192.168.0.1] Other data
Line2 - Client IP [192.168.0.2] Other data
Line3 - Client IP [192.168.0.3] Other data
Line4 - Client IP [192.168.0.2] Other data
Line5 - Client IP [192.168.0.1] Other data
...

Мне нужно создать скрипт, который:

  • извлекает IP-адреса из этого файла
  • группирует IP-адреса (один и тот же IP-адрес сообщается только один раз)
  • выводит файл с полученными IP-адресами

В предыдущем примере получился бы файл:

192.168.0.1
192.168.0.2
192.168.0.3

Я работаю в ОС Windows, но могу использовать такие инструменты, как Cygwin или Инструменты Unix (которые предоставляют Unix-подобные команды, такие как grep, sort и т. д. Под Windows).

Решение без сценариев тоже может быть хорошим.

Заранее спасибо за помощь.

Если вам нужно много писать сценарии на платформе Windows, вам следует попробовать PowerShell. Его легко освоить, и на платформе Windows с ним мало что можно сделать.

Steven Murawski 08.10.2008 22:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
946
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

 cat yourfile.txt | sed 's/*\[//g' | sed 's/\]*//g' | sort | uniq > newfile.txt

Для скобок могут быть ненужными экранирования. Не помню. Все эти инструменты должен доступны в Cygwin.

Вот короткий сценарий sed, который извлекает часть между квадратными скобками, а затем sort -u удаляет дубликаты:

sed -e 's/^.*\[\(.*\)\].*$//g' < inputfile | sort -u
Ответ принят как подходящий

В PowerShell:

Многословный путь -

$regex = '(?<IPAddress>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
get-content log.txt | where-object {if ($_ -match $regex){$matches.ipaddress}} | group-object -noelement

Укороченная версия

gc log.txt | % {if ($_ -match $regex){$matches.ipaddress}} | group -n

Довольно сложно превзойти эти сценарии sed по лаконичности. Хорошо, читабельность - проблема ...

Вы могли бы сделать более подробную и, возможно, более читаемую версию на VBScript, используя Scripting.FileSystemObject для доступа к файлам, используя регулярные выражения VBScript и объект Dictionary, как показано ниже.

Option Explicit

Dim oFSO
Dim oRgx
Dim oMatch
Dim oMatches
Dim oStream
Dim sLine
Dim oDict
Dim sIP
Dim aKeys
Dim sKey

Set oFSO     = CreateObject( "Scripting.FileSystemObject" )
Set oDict    = CreateObject( "Scripting.Dictionary" )

Set oStream  = oFSO.OpenTextFile( "log.txt", 1, False )

Set oRgx     = new regexp
oRgx.Pattern = "\[(.+?)\]"
oRgx.Global  = True

Do While Not oStream.AtEndOfStream
  sLine        = oStream.ReadLine
  Set oMatches = oRgx.Execute(sLine)

  For Each omatch in omatches
    sIP         = oMatch.SubMatches(0)

    If Not oDict.Exists( sIP ) Then
      oDict.Add sIp,1
    End If

  Next

Loop

aKeys = oDict.Keys

For Each sKey in aKeys
  wscript.echo sKey
Next

Если вы можете использовать Cygwin, нет смысла беспокоиться о решении для сценариев Windows.

Другие вопросы по теме