正则表达式与文本格式化处理

正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单地说,正则表达式就是用在字符串处理上面的一项“表示式”。正则表达式不是一个工具程序,二是一种字符处理的标准依据。

12.1前言:什么是正则表达式

正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找删除替换某特定字符串的处理程序。

正则表达式与文本格式化处理_第1张图片


12.2基础正则表达式

正则表达式与文本格式化处理_第2张图片

用dmesg列出内核信息,再以grep找出内含eth的哪行

dmesg | grep ‘eth’

dmesg |grep -n --color=auto ’eth‘

dmesg |grep -n -A3 -B2 --color=auto 'eth'


grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的

alias grep=’grep --color=auto‘

再以source ~./bashrc来立即生效即可


grep练习:

查找特定字符串

-n显示行号

正则表达式与文本格式化处理_第3张图片

-v反向选择

正则表达式与文本格式化处理_第4张图片

-i忽视大小写

正则表达式与文本格式化处理_第5张图片


利用中括号[]查找集合字符



正则表达式与文本格式化处理_第6张图片












行首与行尾字符^$



正则表达式与文本格式化处理_第7张图片


正则表达式与文本格式化处理_第8张图片




正则表达式与文本格式化处理_第9张图片


正则表达式与文本格式化处理_第10张图片


grep -n '^$' cyf.txt找出空行


匹配一个字符.与重复字符*

.(小数点):代表一定有一个任意字符的意思

*(星号):代表重复前一个0到无穷多次的意思,为组合形态





正则表达式与文本格式化处理_第11张图片

正则表达式与文本格式化处理_第12张图片


限定连续RE字符范围{}

正则表达式与文本格式化处理_第13张图片




正则表达式的字符

正则表达式与文本格式化处理_第14张图片

正则表达式与文本格式化处理_第15张图片





sed工具

sed本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选定特定行等功能

正则表达式与文本格式化处理_第16张图片

正则表达式与文本格式化处理_第17张图片

以行为单位的新增、删除功能

#将/etc/passwd的内容列出并且打印行号,同时,删除2-5行
nl /etc/passwd |grep '2,5d'
#在第二行后加上'drink tea'
nl /etc/passwd |sed '2a drink tea'




以行为单位的替换与现实功能




sed 's/要被替换的字符串/新的字符串/g'

正则表达式与文本格式化处理_第18张图片






正则表达式与文本格式化处理_第19张图片

正则表达式与文本格式化处理_第20张图片

正则表达式与文本格式化处理_第21张图片

直接修改文件内容(危险操作)

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

sed -i 's/\.$/\!/g' cyf.txt 

利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

sed -i '$a # This is a test' regular_express.txt

12.3扩展正则表达式

正则表达式与文本格式化处理_第22张图片


12.4文件的格式化与相关处理


格式化打印:printf

正则表达式与文本格式化处理_第23张图片



awk:好用的数据处理工具

awk也还一个非常棒的数据处理工具。相比于sed常常作用域一整行的处理,awk则比较倾向于将一行分成数据“字段”来处理

awk适合处理小型的数据处理

格式:

awk '条件类垄1{劢作1} 条件类垄2{劢作2} ...' filename

正则表达式与文本格式化处理_第24张图片


正则表达式与文本格式化处理_第25张图片


整个awk的处理流程:

读入第一行,并将第一行的数据填入$0,$!,$2等变量当中;

依据条件类型的限制,判断是否需要进行后面的动作

做完所有的动作与条件类型

若还有后续的行的数据,则重复上面1-3的步骤指导所有的数据都度完为止

awk是以行为一次处理的单位,而以字段为最小的处理单位。

正则表达式与文本格式化处理_第26张图片


正则表达式与文本格式化处理_第27张图片


awk的逻辑运算符

正则表达式与文本格式化处理_第28张图片


在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔, 该档案中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号不第三栏,

正则表达式与文本格式化处理_第29张图片

为什么第一行没有正确显示?因为我们读入第一行的时候,那些变量$!,$2默认还是以空格为分割的,所以虽然我们定义了FS=“:”,但是却仅能在第二行后才开始生效。

正则表达式与文本格式化处理_第30张图片

正则表达式与文本格式化处理_第31张图片



 awk 的指令间隔:所有 awk的动作,即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键杢隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
 不 bash shell 的变量不同,在 awk 当中,变量可以直接使用不需加上 $ 符号。


文件的比较工具

通常同一个软件的不同版本之间,比较配置文件与源文件的区别。很多时候所谓的文件的比较,通常是用在ASCII纯文本文件的比较上。

比较的命令diff

可以通过cmp比较非纯文本文件,同时也能够通过diff创建分析文件

diff

diff就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,一般是用ASCII纯文本文件的比较上。由于是一行为单位比较的单位,因此diff通常是用在同一的文件(或软件)的新旧版本区别上

正则表达式与文本格式化处理_第32张图片

正则表达式与文本格式化处理_第33张图片

cmp

cmp主要也是比较两个文件,它主要利用字节单位去比较。因此当然也可以比较二进制文件



patch

patch这个命令与diff可是密不可分的

diff是比较两个版本之间的区别

如果升级呢?就是将旧的文件升级为新的文件时应该怎么做?

就是先比较新旧版本的区别,并将区别文件制作称为补丁文件,在由补丁文件更新旧文件即可。

正则表达式与文本格式化处理_第34张图片

cp /etc/passwd /home/cyf/sh/passwd.old
cat /home/cyf/sh/passwd.old |sed -e '4d' -e '6c no six line' >passwd.new
正则表达式与文本格式化处理_第35张图片

一般使用diff制作出来的比较文件通常使用扩展名。patch

新文件看到-会删除,看到+会加入

更新新旧数据

正则表达式与文本格式化处理_第36张图片

还原旧文件的内荣

正则表达式与文本格式化处理_第37张图片


文件打印准备:pr




你可能感兴趣的:(正则表达式与文本格式化处理)