正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单地说,正则表达式就是用在字符串处理上面的一项“表示式”。正则表达式不是一个工具程序,二是一种字符处理的标准依据。
12.1前言:什么是正则表达式
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找删除替换某特定字符串的处理程序。
12.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显示行号
-v反向选择
-i忽视大小写
利用中括号[]查找集合字符
行首与行尾字符^$
grep -n '^$' cyf.txt找出空行
匹配一个字符.与重复字符*
.(小数点):代表一定有一个任意字符的意思
*(星号):代表重复前一个0到无穷多次的意思,为组合形态
限定连续RE字符范围{}
正则表达式的字符
sed工具
sed本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选定特定行等功能
以行为单位的新增、删除功能
#将/etc/passwd的内容列出并且打印行号,同时,删除2-5行 nl /etc/passwd |grep '2,5d'
#在第二行后加上'drink tea' nl /etc/passwd |sed '2a drink tea'
以行为单位的替换与现实功能
sed 's/要被替换的字符串/新的字符串/g'
直接修改文件内容(危险操作)
利用 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.4文件的格式化与相关处理
格式化打印:printf
awk:好用的数据处理工具
awk也还一个非常棒的数据处理工具。相比于sed常常作用域一整行的处理,awk则比较倾向于将一行分成数据“字段”来处理
awk适合处理小型的数据处理
格式:
awk '条件类垄1{劢作1} 条件类垄2{劢作2} ...' filename
整个awk的处理流程:
读入第一行,并将第一行的数据填入$0,$!,$2等变量当中;
依据条件类型的限制,判断是否需要进行后面的动作
做完所有的动作与条件类型
若还有后续的行的数据,则重复上面1-3的步骤指导所有的数据都度完为止
awk是以行为一次处理的单位,而以字段为最小的处理单位。
awk的逻辑运算符
在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔, 该档案中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号不第三栏,
为什么第一行没有正确显示?因为我们读入第一行的时候,那些变量$!,$2默认还是以空格为分割的,所以虽然我们定义了FS=“:”,但是却仅能在第二行后才开始生效。
awk 的指令间隔:所有 awk的动作,即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键杢隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
不 bash shell 的变量不同,在 awk 当中,变量可以直接使用不需加上 $ 符号。
文件的比较工具
通常同一个软件的不同版本之间,比较配置文件与源文件的区别。很多时候所谓的文件的比较,通常是用在ASCII纯文本文件的比较上。
比较的命令diff
可以通过cmp比较非纯文本文件,同时也能够通过diff创建分析文件
diff
diff就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,一般是用ASCII纯文本文件的比较上。由于是一行为单位比较的单位,因此diff通常是用在同一的文件(或软件)的新旧版本区别上
cmp
cmp主要也是比较两个文件,它主要利用字节单位去比较。因此当然也可以比较二进制文件
patch
patch这个命令与diff可是密不可分的
diff是比较两个版本之间的区别
如果升级呢?就是将旧的文件升级为新的文件时应该怎么做?
就是先比较新旧版本的区别,并将区别文件制作称为补丁文件,在由补丁文件更新旧文件即可。
cp /etc/passwd /home/cyf/sh/passwd.old cat /home/cyf/sh/passwd.old |sed -e '4d' -e '6c no six line' >passwd.new
一般使用diff制作出来的比较文件通常使用扩展名。patch
新文件看到-会删除,看到+会加入
更新新旧数据
还原旧文件的内荣
文件打印准备:pr