前言:
简单的说,正规表示法就是处理字符串的方法,他是以行为单位, 来进行字符串的处理行为,他透过一些特殊符号的辅助,可以让使用者轻易的达到 搜寻/取代 某特定字符串的处理程序!
一、基础正规表示法
关于grep的用法,已经在Bash Shell一章中做详细介绍。
二、格式化打印
语法:printf '打印格式' 实际内容
关于格式方面的几个特殊样式:
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [tab] 按键
\v 垂直的 [tabl] 按键
常见的变数格式:
%ns :n 是数字,s代表 string ,即多少个字符;
%ni :n 是数字,i代表 integer ,即多少整数字数;
%N.nf :n与N都是数字,f代表浮点数,如果有小数字数,假设我共要十个位数,但小数点有两位,即为 %10.2f !
三、sed指令
sed语法:sed [-nefr] [n1,n2 function]
参数:
-n :使用安静模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有
经过 sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
n1, n2:代表选择进行动作的行数,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则10,20[动作行为]
function有底下这些:
a :新增,a 的后面可以接字符串,在目前的下一行新增
c :取代,c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何字符;
i :插入, i 的后面可以接字符串,在目前的上一行插入;
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
范例:
1.将 /etc/passwd 的内容列出,并且我需要打印行号,同时将第 2~5 行删除:nl /etc/passwd | sed '2,5d'
注意: sed 后面接的动作,请务必以 '' 两个单引号括住。
至于删除第3到最后一行,则是 sed '3,$d' 的
2.将第 2-5 行的内容取代成为No 2-5 number:nl /etc/passwd | sed '2,5c No 2-5 number'
3.仅列出第 5-7 行:nl /etc/passwd | sed -n '5,7p'
4.sed -e '4d' -e '6c no six line' > /tmp/test/passwd
#注意一下,sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行!
四、awk指令
语法:awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename
在awk指令中可以使用$1 $2....,$1表示是文档的第一栏,$2表示是文档的第二栏。
比较特殊的是$0,它表示“一整行资料”的意思。
通过对上面变量的解释,就可以知道awk 是『以行为一次处理的单位』, 而『以字段为最小的处理单位』的指令。
awk的内建变量:
NF 每一行($0) 拥有的字段总数
NR 目前awk 所处理的是第几行数据
FS 目前的分隔字符,预设是空格键
例如:列出每一行的数据,并且列出目前处理的行数, 该行有多少字段:awk '{print $1 "\t lines: " NR "\t columes: " NF}'
注意:awk 后续的所有动作以单引号' 括住, 所以内容如果想要以print 打印时,记得非变量的文字部分,都需要使用双引号来定义出来。
awk的条件类型:
逻辑运算符:> 大于 < 小于 >= 大于或等于 <= 小于或等于 == 等于 !=不等于
举例来说,在/etc/passwd 当中是以冒号":" 来作为字段的分隔,那假设我要查阅,第三栏小于10 以下的数据,并且仅列出账号与第三栏, 那么可以这样做:cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'
注意:虽然我们定义了FS=":" 了, 但是却仅能在第二行后才开始生效。那该怎么办呢?我们可以预先设定awk 的变量! 利用BEGIN 这个关键词:awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
五、文件数据对比与打印的相关功能
1、diff
作用:用在比对两个档案之间的差异。
用法:diff [-bBi] from-file to-file
参数:
from-file :一个档名,作为原始比对档案的档名;
to-file :一个档名,作为目的比对档案的档名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。
-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。
范例:
比对 /tmp/test/passwd 与 /etc/passwd 的差异:diff /etc/passwd /tmp/test/passwd
4d3 <==这里是说,左边档案(/etc/passwd)第四行被删除 (d)
6c5 <==这里是说,左边档案的第六行被取代成右边档案(/tmp/test/passwd)的第五行
2、cmp
相对于diff 的广泛用途,cmp 似乎就用的没有这么多了,diff 主要是以『行』为单位比对,cmp 则是以『位』为单位去比对,这并不相同!
用法: cmp [-s] file1 file2
参数:
-s :将所有的不同点的位处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。
范例:
用 cmp 比较一下 /etc/passwd 与 /tmp/test/passwd :cmp /etc/passwd /tmp/test/passwd
/etc/passwd /tmp/test/passwd differ: byte 106, line 4 #第一个发现的不同点在第四行,而且位数是在第106 个位处!