首页 > 其他分享 >第24章 使用正则表达式解析文本文件

第24章 使用正则表达式解析文本文件

时间:2023-02-04 16:00:46浏览次数:42  
标签:24 PS 匹配 字符 正则表达式 用于 文本文件 match

第24章 使用正则表达式解析文本文件

  正则表达式(regular expression,或regex)能够非常有效地进行文本解析,你经常会在UNIX或Linux操作系统中用到。

24.2 正则表达式入门

  某些特定的字符在正则表达式有特殊的含义,这些特定字符可以允许你检测文本变量中的文本模式。下面是一些示例。

  • \w 用于匹配“文本字符”,也就是字母、数字以及下划线,但不包含标点符号和空格。
  • \W与\w相反(这也是PowerShell会区分大小写的一个示例),意思是它将会匹配空格与标点符号——也就是“非字母”。
  • \d 用于匹配包括0-9的任意数字。
  • \D 用于匹配任意非数字。
  • \s 用于匹配任意空白字符,比如Tab、空格或者回车符。
  • \S 用于匹配任意非空白字符。
  • . (句号)代表任意单个字符。
  • [abcde]用于匹配在该集合中的任意字符。
  • [a-z]匹配在此范围内的一个或多个字符,可以使用逗号分隔列表指定多个范围,比如说[a-f,m-z]。
  • [^aeiou]用于匹配不在该集合范围中一个或多个字符。
  • ? 将?置于另一个字母或特殊符号之后,可以用于匹配该字符的一个实例。所以正则表达式do?n可以与“don”匹配,但不会与“doon”匹配。该正则表达式还可以与“dn”匹配,这是由于?还可以代表空实例。
  • * 用于匹配该符号之前任意数量的实例。正则表达式don将会与“doon”和“don”匹配。该正则表达式还可以与“dn”匹配,这是由于还可以代表空实例。
  • + 用于匹配该符号之前任意数量的实例。你会经常看到该字符和括号一起使用,从而创建了一种子表达式。
  • \ (反斜杠)是正则表达式转义字符。
  • {2} 用于匹配该符号之前特定数量的实例。比如,\d{1}用于匹配一个数字,使用\d{2,}用于匹配2个或多个数字,使用\d{1,3}匹配至少1个但不超过3个实例。
  • ^ 用于匹配字符串开始部分。比如,正则表达式d.n既可以匹配“don”,又可以匹配“pteranodon”。而正则表达式^d.n只能匹配“don”,而无法匹配“pteranodon”。
  • $ 用于匹配字符串结尾部分。比如,正则表达式.icks既可以与“hicks”匹配,又可以与“sticks”匹配,还能够与“Dickson”匹配。但正则表达式.icks$无法与“Dickson”匹配,这是因为$表示字符“s”应该是该字符串最后一个字符。

  总之,你快速查看了一遍正则表达式的语法。正如我们在开始所写的那样,正则表达式还有大量内容,但这些内容足够你完成基本工作。让我们来看一些正则表达式的例子。

  • \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}可以匹配IPv4地址的模式,但该表达式可以接受“432.567.875.000”这样的非法地址,也可以接受“192.168.15.12”这样的合法地址。
  • \\\\\w(\\\w+)+可以匹配通用命名惯例(UNC)路径。大量的反斜杠使得该正则表达式难以阅读,这也是为什么将正则表达式部署到生产环境之前对正则表达式进行调试和调整。
  • \w{1}.\[email protected]可以匹配特定类型的电子邮件地址:首先是一个字母,然后是句号,最后是“@company”。

24.3 通过-Match使用正则表达式

  PowerShell包含一个比较运算符-Match,以及一个区分大小写的版本-Cmatch。通过这两个运算符与正则表达式进行比较。下面是一些示例。

PS C:\> "don" -match "d[aeiou]n"
True
PS C:\> "dooon" -match "d[aeiou]n"
False
PS C:\> "dooon" -match "d[aeiou]+n"
True
PS C:\> "djinn" -match "d[aeiou]+n"
False
PS C:\> "dean" -match "d[aeiou]n"
False

24.4 通过Select-String使用正则表达式

  现在终于到了本章的精华之处,我们使用一些日志文件作为示例,这是由于IIS日志是纯文本,而这正是正则表达式的用武之地。
  让我们先在日志文件中查找40x错误。

PS C:\logfiles>get-childitem -filter *.log -recurse |
select-string -pattern "\s40[0-9]\s" | 
format-table Filename,LineNumber,Line -wrap

  我们希望查找所有事件ID为4624事件,该事件代表帐户登录事件。但我们只希望查看帐户名称以“WIN”开头的登录信息,这些帐户都与在域中的计算机帐户关联。我们还要求帐户结尾必须是从TM20$到TM40$的字符,这些都是我们感兴趣的特定计算机。我们需要的正则表达式大概如下:WIN[\W\w]+TM[234][0-9]\$——注意我们需要使用转义符号将末尾的$进行转义,因此该符号不会被解释成字符串结尾标记。我们需要包含与\w字符类匹配。因此最终下面是我们的命令。

PS C:\>get-eventlog -LogName security | 
where { $_.eventid -eq 4624 } | 
select -ExpandProperty message | 
select-string -pattern "WIN[\W\w]+TM[234][0-9]\$"

  在开始部分,我们使用Where-Object,从而使得ID为4624的事件被筛选出来。然后我们将Message属性的内容存入纯字符串,并通过将其传输给Select-String。注意,这将会输出匹配的信息文本;如果我们的目标是输出所有匹配的事件,我们需要使用另一种方式。

PS C:\>get-eventlog -LogName security |
where { $_.eventid -eq 4624 -and $_.message -match "WIN[\W\w]+TM[234][0-9]\$" }

  这里,我们不是输出Message属性的内容,而是查找Message属性匹配正则表达式的记录——接下来输出整个Event对象。接下来所使用的命令取决于结果希望输出的形式。

标签:24,PS,匹配,字符,正则表达式,用于,文本文件,match
From: https://www.cnblogs.com/evan-whc/p/17091708.html

相关文章