正规表示法Regular Expression

前言:

简单的说,正规表示法就是处理字符串的方法,他是以行为单位, 来进行字符串的处理行为,他透过一些特殊符号的辅助,可以让使用者轻易的达到 搜寻/取代 某特定字符串的处理程序!

 

一、基础正规表示法

关于grep的用法,已经在Bash Shell一章中做详细介绍。

 

二、格式化打印

语法:printf '打印格式实际内容

关于格式方面的几个特殊样式: 

\n 输出新的一行 

\r 亦即 Enter 按键 

\t 水平的 [tab] 按键 

\v 垂直的 [tabl] 按键 

常见的变数格式:

%ns 是数字,s代表 string ,即多少个字符; 

%ni 是数字,i代表 integer ,即多少整数字数; 

%N.nf nN都是数字,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有底下这些:

:新增,的后面可以接字符串,在目前的下一行新增

:取代,的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行! 

:删除,因为是删除啊,所以 后面通常不接任何字符; 

:插入, 的后面可以接字符串,在目前的上一行插入; 

:打印,亦即将某个选择的数据印出。通常 会与参数 sed -n 一起运作

:取代,可以直接进行取代的工作哩!通常这个 的动作可以搭配正规表示法!例如 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 numbernl /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}'

 

五、文件数据对比与打印的相关功能

1diff

作用:用在比对两个档案之间的差异。

用法: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)的第五行

 

2cmp

相对于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 个位处!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值