1

我需要一些 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 操作系统上,但我可以使用CygwinUnix Tools之类的工具(在 Windows 下提供类似 Unix 的命令,如 grep、sort 等)。

没有脚本的解决方案也可能很好。

在此先感谢您的帮助。

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

这是一个简短的 sed 脚本,它提取方括号之间的部分,然后sort -u删除重复项:

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 脚本。好吧,可读性是个问题...

您可以使用 Scripting.FileSystemObject 进行文件访问,使用 VBScript 的正则表达式和 Dictionary 对象,在 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 回答