正则表达式和文件处理器

一、正则表达式

正则表达式,又称规则表达式,Regular Expression,在代码中常简写为 regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,

在一些工具会用到:grep sed awk egrep 


正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式
正则表达式是由普通字符元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

LINUX 中常用的有两种正则表达式引擎

  • 基础正则表达式:BRE
  • 扩展正则表达式: ERE

1.1、基础正则表达式常见元字符

(支持的工具:grep、egrep、sed、awk)


特殊字符

  • \:转义符,将特殊字符进行转义,忽略其特殊意义           例: a\.b匹配a.b 不转义就是任意(不为\r\n)单词awb,acb都行
  • ^:匹配行首,^则是匹配字符串的开始                               例:^tux匹配以tux开头的行
  • $:匹配行尾,$则是匹配字符串的结尾                              例:tux$匹配以tux结尾的行
  • .:匹配除换行符\r\n之外的任意单个字符
  • [list]:匹配list列表中的一个字符                   例: go[ola]d,[abc]、[a-z]、[a-z0-9]
  • [^list]:匹配任意不在list列表中的一个字符   例: [^a-z]、[^0-9]、[^A-Z0-9]
  • *:匹配前面子表达式0次或者多次                例: goo*d、go.*d
  • \{n\} :匹配前面的子表达式n次,                   例:   go\{2\}d、'[0-9]\{2\}'匹配两位数字
  • \{n,\}:匹配前面的子表达式不少于n次            例:   go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数
  • \{n,m\}﹔匹配前面的子表达式n到m次           例:  go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字

注:

egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
egrep -E -n 'wo{2,3}d' test.txt   //-E 用于显示文件中符合条件的字符

定位符

  • ^ 匹配输入字符串开始的位置
  • $ 匹配输入字符串结尾的位置

非打印字符

  • \n 匹配一个换行符
  • \r 匹配一个回车符
  • \t 匹配一个制表符

补充

  1. \n(换行符)
    • \n 代表换行符(Line Feed,LF),在 Unix/Linux 系统中常用作行的结束符。
    • 在文本文件中,\n 用于指示当前行的结束和新行的开始。
  2. \r(回车符)
    • \r 代表回车符(Carriage Return,CR),在早期的计算机系统中(如 Mac OS 9 及之前的版本),它被用作行的结束符。
    • 在 Windows 系统中,通常使用 \r\n(回车符后跟换行符)作为行的结束符。
  3. \t(制表符)
    • \t 代表制表符(Tab),它不是用来表示行的结束,而是用于在文本中创建水平间隔,通常用于对齐文本。

也就可以发现,windows中结束符是\r\n而linux中是\n,需要注意一下。

\t就是对齐文本的。


1.2、扩展正则表达式

(支持的工具:egrep、awk)
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。

例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用于查看生效的配置文件),执行“grep -v '^$'  test.txt | grep -v '^#'  即可实现。这里需要使用管道命令来搜索两次。

如果使用扩展正则表达式, 可以简化为“egrep -v  '^$' |   '^#'  test.txt,

其中,单引号内的管道符号表示或者(or),其实也可以不叫管道符了,|作为扩展正则表达式。
此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达式的元字符主要包括以下几个

+    作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串

?    作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串,s是前一个字符

|    作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on'   test.txt”命令即可查询"of"或者"if"或者"on"字符串

()    作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串

()+    作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

1.3、元字符操作的案列

(1)查找特定字符
查找特定字符非常简单,如执行以下命令即可从 test.txt 文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色(本章中全部通过加粗显示代替)。

egrep -n 'the' test.txt

若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号。

grep -vn 'the' test.txt


(2)利用中括号“[]”来查找集合字符

想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。

grep -n 'sh[io]rt'  test.txt

若要查找包含重复单个字符“oo”时,只需要执行以下命令即可。

grep -n 'oo' test.txt

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的。例如执行“grep -n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串。

grep -n '[^w]oo' test.txt

注意:在[ ]内的^是取反[^],在外是开头行的意思 '^$'

但是在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知, “#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #”也符合匹配规则。
若不希望“oo”前面存在小写字母,可以使用“grep -n‘[^a-z]oo’test.txt”命令实现,其中

“a-z”表示小写字母,大写字母则通过“A-Z”表示。

grep -n '[^a-z]oo' test.txt

查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现。

grep -n '[0-9]' test.txt

(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。
在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,
则可以通过“^”元字符来实现。

查询以小写字母开头的行可以通过“^[a-z]”规则来过滤,查询大写字母开头的行则使用,“^[A-Z]”规则,若查询不以字母开头的行则使用“^[^a-zA-Z]”规则。

grep -n '^[^a-zA-Z]' test.txt

 “^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。
例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符。

当查询空白行时,执行“grep -n ‘^$’   test.txt”命令即可。


(4)查找任意一个字符“.”与重复字符“*” 

前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符,例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。

在上述结果中,“wood”字符串“w..d”匹配规则。若想要查询 oo、ooo、ooooo 等资料, 则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。 “o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep  -n 'o*' test.txt”命令会将文本中所有的内容都输出打印。

如果是“oo*”,则第一个 o 必须存在, 第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep -n 'ooo*' test.txt”命令即可。
 

因为是重复前面的0个或者多个,所以就是说没有也可以

查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现。
grep -n 'woo*d' bbb

执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串。

grep -n 'w.*d' bbb

执行以下命令即可查询任意数字所在行。
grep -n '[0-9][0-9]*' test.txt

(5)查找连续字符范围“{}”
在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示。
① 查询两个 o 的字符。

grep -n 'o\{2\}' bbb

② 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串。
grep -n 'wo\{2,5\}d' bbb

③ 查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
grep -n 'wo\{2,\}d' bbb

 附

练习测试bbb

he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words


#woood #
#woooooood
# AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
tast
Axyzxyzxyzxyz
1sdg`ZZ

总结

元字符
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个

  • ^    匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“\^”
  • $    匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“$”也匹配‘\n’或‘\r’。要匹配“$”字符本身,请使用“\$”
  • .    匹配除“\r\n”之外的任何单个字符
  • \    反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
  • *    匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“\*”
  • []    字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
  • [^]    赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plin”中任何一个字母
  • [n1-n2]    字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。
  • 注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
  • {n}    n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”
  • {n,}    n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
  • {n,m}    m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

扩展

.   匹配任意单个字符,可以是一个汉字  
[]   匹配指定范围内的任意单个字符,示例:[zhou]   [0-9]   []   [a-zA-Z]   [[:alpha:]]    [0-9a-zA-Z]= [:alnum:]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符
 

二、grep和egrep

grep是文本三剑客之一

格式

grep [选项]… 查找条件 目标文件

  • -E :开启扩展(Extend)的正则表达式
  • -c :计算找到 '搜寻字符串' 的次数
  • -i :忽略大小写的不同,所以大小写视为相同
  • -o :只显示被模式匹配到的字符串
  • -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(反向查找,输出与查找条件不相符的行)
  • --color=auto :可以将找到的关键词部分加上颜色的显示喔!
  • -n :顺便输出行号

案列
grep -c root /etc/passwd        //统计root字符总行数;或cat /etc/passwd | grep root 
grep  -i "the"   web.sh          //不区分大小写查找the所有的行
grep -v root /etc/passwd           //将/etc/passwd,将没有出现 root 的行取出来
cat web.sh |grep -v '^$' >test.txt  //将非空行写入到test.txt文件
ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -1 //过滤出IP

三、命令小工具

3.1、cut:列截取工具


使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一

 选项:

  • -b:按字节截取
  • -c:按字符截取,常用于中文
  • -d:指定以什么为分隔符截取,默认为制表符
  • -f:通常和-d一起

 cat /etc/passwd | cut -d':' -f 1

cat /etc/passwd | cut -d ':' -f 3

cat /etc/passwd | cut -d':' -f1,3

1到3

cat /etc/passwd | cut -d':' -f1-3

who | cut -b 3

cat qq | cut -c 2

-b就不行

3.2、sort :行为单位排序的工具

一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样
语法:
sort [选项] 参数

常用选项

  • -t:指定分隔符,默认使用[Tab]吧 键或空格分隔
  • -k:指定排序区域,哪个区间排序
  • -n:按照数字进行排序,默认是以文字形式排序
  • -u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
  • -r:反向排序,默认是升序,-r就是降序
  • -o:将排序后的结果转存至指定文件

sort a    //不加任何选项默认按第一列升序,字母的话就是从a到z由上

sort -n -t: -k3  passwd.txt   //以冒号为分隔符,以数字大小对第三列排序(升序)

sort -nr -t: -k3 passwd.txt   //以冒号为分隔符,以数字大小对第三列排序(降序)

sort -nr -t: -k3 passwd.txt -o passwd.bak    //将输结果不在屏幕上输出而是输出到passwd.bak文件

sort -u a    //去掉文件中重复的行(重复的行可以是不连续的)

附测试内容a:

zhangsan
zhangsan
zhangsan
gggggg
lisi

3.3、uniq:除连续的重复行的工具


主要用于去除连续的重复行,

注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重。

格式
uniq [选项] 参数

常用选项

  • -c:对重复的行进行计数;
  • -d:仅显示重复行;
  • -u:仅显示出现一次的行

测试内容fruit

apple
apple
peache
pear
banana
cherry
cherry
banana
orange

统计重复行的次数,不连续的重复行他不算做重复行

cat fruit | uniq -c    

结合sort使用就是我们想要的效果

结合sort使用,过滤出不重复的行(显示不重复的行)

cat fruit | sort | uniq      //结合sort使用,去重

cat fruit | sort -u     //也可以直接用sort -u  去重

注意尾行不能有空格

多添加一个

3.3.1、实例1:查看登陆用户

who | awk '{print $1}'

who | awk '{print $1}'| uniq

3.3.2、实例2:查看登陆过系统的用户

last |awk '{print $1}'|sort |uniq |grep -v "^$" |grep -v wtmp

3.4、tr:替换删除的工具

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

不改变原文件

语法
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

常用选项

  • -d 删除字符
  • -s 删除所有重复出现的字符,只保留第一个

测试

cat fruit | tr 'a-z' 'A-Z'

cat gg | tr 'iaa' 'cbb'    //替换是一一对应的字母的替换

就是i对应c  a对应b  iaaa  变成cbbb

那如果是a对应b又对应x呢,取最后一个

cat fruit | tr 'a' ' '   //把替换的字符用单引号引起来,包括特殊字符

注意有空格

 cat fruit | tr 'ap' '/'    //多个字符替换成一个

a是/

p也是/

cat gg |tr 'iaap' 'st'     //i替换成s,app替换成t

cat fruit | tr "'" '/'     //如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行

(好像可以)

cat gg |tr "'" '/'

cat fruit | tr -d 'a'    //删除所有a

cat fruit | tr -d 'iaa'    //把所有含有这3个字母的都删除

删除换行符

cat gg |tr -d '\n'

cat gg | tr -s 'a'    //对a字符去重,只保留第一个

cat gg | tr -s '\n'   //遇到多个回车只保留一个回车,相当于去除空行

附:

gg

iaaa
vvv
aaa
iaaa
bdaf
dgww
app
'999'

3.5、面试组合使用

1.统计当前连接主机数
ss -nt |tr -s " "  |cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c

2.统计当前主机的连接状态
ss -nta  |grep -v '^state'|cut -d " "  -f 1|sort |uniq -c


 

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
filebeat中的正则表达式可以用于对日志文件进行过滤和解析。filebeat支持多种正则表达式语法,例如PCRE、Golang和Oniguruma等。在filebeat中,常见的正则表达式应用包括: 1. 在输入文件路径中使用正则表达式,以匹配多个文件; 2. 在filebeat配置文件中使用正则表达式,以从日志中提取特定字段; 3. 在filebeat处理器中使用正则表达式,以将字段重命名或删除。 下面是一个使用正则表达式从Nginx日志中提取字段的示例: ``` # filebeat.yml filebeat.inputs: - type: log paths: - /var/log/nginx/access.log processors: - dissect: tokenizer: "%{[@metadata][nginx][access]}" field: "message" target_prefix: "nginx.access" - grok: match: message: '%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] "%{WORD:[nginx][access][http_method]} %{DATA:[nginx][access][http_version]}" %{NUMBER:[nginx][access][http_response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} "%{DATA:[nginx][access][referrer]}" "%{DATA:[nginx][access][agent]}"' - date: match_formats: ["dd/MMM/YYYY:H:m:s Z"] target_field: "@timestamp" source_field: "[nginx][access][time]" fields_under_root: true fields: type: nginx output.elasticsearch: hosts: ["localhost:9200"] ``` 以上配置文件中使用了grok处理器,其中的正则表达式可以从Nginx日志中提取remote_ip、user_name、time、http_method、http_version、http_response_code、body_sent、referrer和agent等字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值