Linux学习-鸟哥-第十一章-正则表达式与文件格式化处理

本文详细介绍了正则表达式的基础与扩展概念,包括grep、sed和awk等工具的应用,以及文件格式化与比对技巧,如printf、cmp和diff的使用方法。


正则表达式按照不同的严谨度分为: 基础正则表达式扩展正则表达式。扩展正则表达式除了简单的字符处理之外,还可以作为群组的字符串处理。

一、基础正则表达式

1.grep 的高级选项

  grep [-A] [-B] [--color=auto] '查找字符' filename
#选项与参数
`-A`:后面接数字,为after的意思,除了列出该行之外,后续的n行也显示出来
`-B`:后面接数字,为before的意思,除了列出该行之外,前面的n行也显示出来

示例1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFHNPf6q-1586949055182)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586831097563.png)]
示例2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IAtwuW8f-1586949055186)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586831258973.png)]

2.基础正则表达式练习

  • 查找特定字符串
[kfk@kfk-pro01 ~]$ #例题1:查找特定字符串
[kfk@kfk-pro01 ~]$ grep -n 'the' regular_express.txt --color=auto
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
18:google is the best tools for search keyword.
[kfk@kfk-pro01 ~]$ #反向选择,当该行.没有`the`这个字符串时,才显示
[kfk@kfk-pro01 ~]$ grep -vn 'the' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However, this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
7:Her hair is very beauty.
9:Oh! The soup taste good.
10:motorcycle is cheap than car.
11:This window is clear.
13:Oh!	My god!
14:The gd software is a library for drafting programs.
17:I like dog.
19:goooooogle yes!
20:go! go! Let's go.
21:# I am VBird
22:
  • 利用中括号[]查找集合字符
[kfk@kfk-pro01 ~]$ clear
[kfk@kfk-pro01 ~]$ #当利用中括号[]来查找集合字符
[kfk@kfk-pro01 ~]$ clear
[kfk@kfk-pro01 ~]$ clear
[kfk@kfk-pro01 ~]$ #利用中括号[]来查找集合字符
[kfk@kfk-pro01 ~]$ #查找`t?st`,例如`test`,`tast`
[kfk@kfk-pro01 ~]$ grep -n 't[ae]st' regular_express.txt --color=auto
8:I can't finish the test.
9:Oh! The soup taste good.
[kfk@kfk-pro01 ~]$ #查找有`oo`的字符
[kfk@kfk-pro01 ~]$ grep -n 'oo' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
[kfk@kfk-pro01 ~]$ #查找有`oo`的字符,但是前面没有g字符
[kfk@kfk-pro01 ~]$ grep -n '[^g]oo' regular_express.txt --color=auto
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[kfk@kfk-pro01 ~]$ #查找有`oo`的字符,前面没有小写字母
[kfk@kfk-pro01 ~]$ grep -n '[^a-z]oo' regular_express.txt --color=auto
3:Football game is not use feet only.
  • 行首与行尾字符^$
[kfk@kfk-pro01 ~]$ clear
[kfk@kfk-pro01 ~]$ #想要让the只在行首列出
[kfk@kfk-pro01 ~]$ grep -n '^the' regular_express.txt --color=auto
12:the symbol '*' is represented as start.
[kfk@kfk-pro01 ~]$ #想要让开头是小写字符的那一行列出
[kfk@kfk-pro01 ~]$ grep -n '^[a-z]' regular_express.txt --color=auto
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
[kfk@kfk-pro01 ~]$ #找出行尾结束为小数点.的那一行
[kfk@kfk-pro01 ~]$ grep -n '\.$' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
11:This window is clear.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
20:go! go! Let's go.
# 去掉空白行与#号开头的注释
[kfk@kfk-pro01 ~]$ grep -v '^$' /etc/rsyslog.conf --color=auto |grep -v '^#'
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
  • 任意一个字符.与重复字符*
  `.`:代表一定有一个任意字符
  `*`:代表重复前一个字符,0到无穷多次的意思	

示例

[kfk@kfk-pro01 ~]$ grep -n 'g..d' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
16:The world <Happy> is the same with "glad".
[kfk@kfk-pro01 ~]$ #找出需要至少两个o以上的字符串时,需要ooo*
[kfk@kfk-pro01 ~]$ grep -n 'ooo*' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
[kfk@kfk-pro01 ~]$ grep -n 'ooo*' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
[kfk@kfk-pro01 ~]$ #找出g开头与g结尾的字符串
[kfk@kfk-pro01 ~]$ grep -n 'g.*g' regular_express.txt --color=auto
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.

在这里插入图片描述

  • 限定连续RE字符范围 {}
    由于{}的符号在shell中有特殊意义,因此必须使用转义字符\使其失去特殊意义
  #查找g后面接2到5个o.然后再接一个g的字符串
  [kfk@kfk-pro01 ~]$ grep -n 'go\{2,5\}g' regular_express.txt --color=auto
18:google is the best tools for search keyword.

3.基础正则表达式字符集合

RE字符意义与范例
^word意义:待查找的字符串(word)在行首。范例:grep -n '#' regular_express.txt
word$意义:待查找的字符串(word)在行尾。范例:将行尾为!的那一行打印出来,grep -n!$regular_express.txt
.意义:代表一定有一个任意字符。范例:查找e与e之间包含任意字符的字符串,包括空格,grep -n 'e.e' regualar_express.txt
\意义:转义符,将特殊符号的特殊意义去除。范例:查找含有单引号的那一行,grep -n ` regular_express.txt`
*意义:重复零到无穷多个的前一个RE字符。范例:查找包含(es)、(ess)、(esss)等的字符串。grep -ness*regular_express.txt
[list]意义:字符集合的RE字符。在[]当中仅代表一个待查找的字符。范例:grep -ng[ld]regular_express.txt
[n1-n2]意义:字符集合的RE字符,里面列出想要选取的字符范围。范例:grep -n[A-Z]regular_express.txt
^list意义:字符集合的RE字符,里面列出不需要的字符串或范围。范例:grep -n 'oo[^t]' regular_express.txt
\{n,m\}意义:连续n到m个的【前一个RE字符】。范例:在g与g之间有2-3个的o存在的字符串,grep -ngo\{2,3\}gregular_express.txt

4.sed工具

sed本身也是一个管道命令,可以分析标准输入。而且sed还具有对数据进行替换、删除、新增、选取特定行等功能。
下面介绍一下sed的具体用法

sed [-nefr] [操作]
#选项与参数
  -n:使用安静(silent)模式
  -e:直接在命令行模式上进行`sed`的操作编辑
  -f:直接将`sed`的操作写在一个文件内,-f filename则可以执行filename的sed操作
  -r:`sed`的操作使用的是扩展型正则表达式语法(默认的是基础正则表达式语法)
  -i:直接修改读取的文件内容,不是由屏幕输出
#操作说明:[n1[,n2]] function
  n1,n2:代表[选择进行操作的行数],例如:操作是需要在10到20行之间进行的内容,则[10,20[操作行为]]
  function 中字母的含义:
  `a`:新增,a后面可以接字符,这些字符会在新的一行出现(目前的下一行)
  `c`:替换,c后面可以接字符,这些字符可以替换n1,n2之间的行
  `d`:删除,d后面不接任何字符
  `i`:插入,i的后面可以接字符,这些字符会在新的一行出现(目前的上一行)
  `p`:打印
  `s`:替换
  • 以行为单位的新增/删除功能
    示例:
[kfk@kfk-pro01 ~]$ nl /etc/passwd |sed '2,5d'
     1	root:x:0:0:root:/root:/bin/bash
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    11	operator:x:11:0:operator:/root:/sbin/nologin
    12	games:x:12:100:games:/usr/games:/sbin/nologin
    13	gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    14	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    15	nobody:x:99:99:Nobody:/:/sbin/nologin
    16	vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    17	saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
    18	postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    20	kfk:x:500:500::/home/kfk:/bin/bash
    21	ntp:x:38:38::/etc/ntp:/sbin/nologin
    22	mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
[kfk@kfk-pro01 ~]$ #上面的命令是删除第2-5行
[kfk@kfk-pro01 ~]$ #删除第3到最后一行
[kfk@kfk-pro01 ~]$ nl /etc/passwd |sed '3,$d'
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     
  • 以行为单位的替换与显示功能
    在这里插入图片描述
    在这里插入图片描述
  • 部分数据的查找并替换功能
    sed基本上查找与替换功能与vi类似:
  sed `s/要被替换的字符/新的字符/g`

以处理IP数据为范例:
在这里插入图片描述

  • 直接修改文件内容
  #直接文件以.结尾换位以!结尾

在这里插入图片描述
在这里插入图片描述

二、扩展正则表达式


下面对扩展正则表达式的特殊符号进行介绍

RE字符意义与范例
+意义:重复[一个或一个以上]的前一个RE字符。范例:查找godgoodgoood等字符串,o+代表一个以上的o,所以有:egrep -ngo+dregular_express.txt
?意义:[零个或一个]的前一个字符,范例:egrep -n 'go?d' regular_express.txt
|用或(or)的方式找出整个字符串。范例:egrep -n 'gd|good' regular_express.txt

等等

三、文件的格式化与相关处理

利用数据流重新定向与printfawk命令,可以对输出信息重新进行排版

1.格式化打印:printf

  printf '打印格式' 实际内容
#选项与参数
  关于格式方面的几个特殊样式
  `\a``\b`:退格键
  `\f`:清楚屏幕
  `\n`:输出新的一行
  `\r`:回车
  `\t`:等同于水平的tab按键
  `\v`:等同于垂直的tab按键
  `\xNN`:NN为两位数的数字,可以转换数字成为字符
  C语言程序内,常见的变量格式
  `%ns`:n为数字,s代表`string`,表示多少个字符
  `%ni`:n为数字,i代表`integer`,表示多少整数位
  `%N.nf`:n与N都是数字,f代表floating(浮点)。例如:10个位数,小数点有两位,即`%10.2f`

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eEbrRqnK-1586949055205)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586929434646.png)]

2.awk

  awk '条件类型1{操作1} 条件类型2{操作2} ...' filename

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnxYdSTF-1586949055215)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586930974177.png)]
awk中的内置变量

变量名称代表意义
NF每一行($0) 拥有的字段总数
NR目前awk所处理的是第几行数据
FS目前的分割字符,默认为空格键

示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrZgOibp-1586949055219)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586932822460.png)]

  • awk的逻辑运算字符

    运算单元代表意义
    >与一般的逻辑预算符含义相同,在此不再赘述
    <
    >=
    <=
    ==
    !=

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohtj4IKn-1586949055236)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586933467507.png)]

3.文件比对工具

纯文本文件比对最常见的命令是diff,非纯文本文件最常见的命令是cmp,可以借由diff建立的分析文件,来处理补丁patch功能的文件。

  • diff
    diff以行为单位来比对两个文件之间的差异
  diff [-bBi] from-file to-file
#选项与参数
from-file:一个文件名,作为原始比对文件的文件名
to-file:一个文件名,作为目标比对文件的文件名
`-b`:忽略一行中,由于空白行造成的差异
`-B`:忽略空白行的差异
`-i`:忽略带小写的不同

示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOw4qMbv-1586949055242)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586947370333.png)]

  • cmp
    cmp利用字节单位去比对,用处不是很广泛
  • patch
    将升级之后的文件与旧文件制成补丁文件,扩展名为.patch
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9qcJMqDZ-1586949055249)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1586947849662.png)]
    patch命令可以对旧文件进行升级,或者将新文件进行还原。

四、重点回顾

  • 正则表达式与通配符不同,通配符代表的是bash的一个功能,但是正则表达式是一种字符串处理的表示方式。
  • 基础正则表达式的特殊字符有:*.[][^]^$
  • 常见的支持正则表达式的工具软件有:grepsedvim
  • awk可以使用字段为根据,进行数据的重新整理与输出
    cmp利用字节单位去比对,用处不是很广泛
  • patch
    将升级之后的文件与旧文件制成补丁文件,扩展名为.patch
    [外链图片转存中…(img-9qcJMqDZ-1586949055249)]
    patch命令可以对旧文件进行升级,或者将新文件进行还原。

四、重点回顾

  • 正则表达式与通配符不同,通配符代表的是bash的一个功能,但是正则表达式是一种字符串处理的表示方式。
  • 基础正则表达式的特殊字符有:*.[][^]^$
  • 常见的支持正则表达式的工具软件有:grepsedvim
  • awk可以使用字段为根据,进行数据的重新整理与输出
  • patch命令可以根据diff命令建立的补丁源文件将旧版本的数据更新到最新版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值