1

シェルスクリプトの専門家の助けが必要です。

次のような形式で、複数の行でクライアントの IP アドレスをトレースする .txt ファイル (ログ) があります。

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 アドレスは 1 回だけ報告されます)。
  • 結果のIPアドレスを含むファイルを出力します

前の例では、結果のファイルは次のようになります。

192.168.0.1
192.168.0.2
192.168.0.3

私は Windows OS を使用していますが、CygwinUnix ツール(Windows で grep や sort などの Unix に似たコマンドを提供するツール) などのツールを使用できます。

スクリプトを使用しないソリューションも有効です。

よろしくお願いします。

4

5 に答える 5

6

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
于 2008-10-08T18:49:52.477 に答える
4

sort -u角かっこの間の部分を抽出し、重複を削除する短い sed スクリプトを次に示します。

sed -e 's/^.*\[\(.*\)\].*$/\1/g' < inputfile | sort -u
于 2008-10-08T18:28:21.100 に答える
2
 cat yourfile.txt | sed 's/*\[//g' | sed 's/\]*//g' | sort | uniq > newfile.txt

括弧にはエスケープが不要な場合があります。覚えていない。これらのツールすべて Cygwin で利用できるはずです。

于 2008-10-08T18:26:18.653 に答える
1

簡潔にするために、これらのsedスクリプトを打ち負かすのはかなり難しいです。さて、読みやすさは問題です...

以下のように、VBScriptの正規表現とDictionaryオブジェクトを使用して、ファイルアクセスにScripting.FileSystemObjectを使用して、VBScriptでかなり冗長で読みやすいバージョンを実行できます。

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
于 2008-10-08T18:50:50.680 に答える
0

Cygwin を使用できる場合、Windows スクリプト ソリューションについて心配する必要はほとんどありません。

于 2008-12-18T18:58:35.973 に答える