"Unix shell" - похожий скрипт под Windows - PullRequest
1 голос
/ 08 октября 2008

Мне нужна помощь от гуру shell-скриптов.

У меня есть файл .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 Tools (которые предоставляют Unix-подобные команды, такие как grep, sort и т. Д. Под Windows)

Хорошо бы и решение без сценариев.

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

Ответы [ 5 ]

6 голосов
/ 08 октября 2008

В 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
4 голосов
/ 08 октября 2008

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

sed -e 's/^.*\[\(.*\)\].*$/\1/g' < inputfile | sort -u
2 голосов
/ 08 октября 2008
 cat yourfile.txt | sed 's/*\[//g' | sed 's/\]*//g' | sort | uniq > newfile.txt

В скобках могут быть ненужные побеги. Я не помню Эти инструменты должны быть доступны на Cygwin.

1 голос
/ 08 октября 2008

Довольно сложно победить эти сценарии 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
0 голосов
/ 18 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...