管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

这一节主要介绍正则表达式,以及Linux管道命令grep、sed结合正则表达式,毫不夸张的说,了解了这些用发以后,那么在学习Linux路上相当于跨了一大步。

基础正则表达式介绍grep结合正则表达式sed结合正则表达式基础正则表达式介绍先介绍一些必要的符号[:alnum:] 代表英文大小写字符及数字,亦即 0-9, A-Z, a-z

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:blank:] 代表空白键与 [Tab] 按键两者

[:cntrl:] 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等

[:digit:] 代表数字而已,亦即 0-9

[:graph:] 除了空白字符 (空白键与 [Tab] 按键) 外的其他所有按键

[:lower:] 代表小写字符,亦即 a-z

[:print:] 代表任何可以被打印出来的字符

[:punct:] 代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...

[:upper:] 代表大写字符,亦即 A-Z

[:space:] 任何会产生空白的字符,包括空白键, [Tab], CR 等等

[:xdigit:] 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

尤其上表中的[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 这几个一定要知道代表什么意思,因为他要比 a-z 或 A-Z 的用途要确定的很!

一些常用的限定符* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。

{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

好了,下面就让我们开始来玩玩进阶版的 grep 吧!

正则表达式下的grep我们使用一个模板文件express.txt(借用鸟哥的文件)

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

express.txt模板练习文件

示例一 、在express.txt中搜索'the',反向搜做’the‘(搜索不包含'the'的行)。

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

搜索、反向搜索'the'

上图第一个命令是搜索’the‘并且高亮显示(高亮显示是因为在alias中grep做了--color=auto别名),第二个命令是"反向"查找'the',即显示出不含;'the'的行。

示例二、使用[]来搜索集合字符(常用)

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

[]集合字符用发

[ae]指的是字符'a'或'e'。

示例三、在express.txt中搜索'oo',以及不以'g'开头的'oo'行

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

搜索'oo',以及不以'g'开头的'oo'行

上图中第二个命令[^g]意思是字符'g'的反向选择(没有[]的^是什么还记的吗?),也就是说'[^g]oo'意思是搜索包含'oo'但是不是'goo'。

下面出类似的题,大家试着想一下,

root@ubuntu:/tmp# grep -n '[^a-z]oo' express.txtroot@ubuntu:/tmp# grep -n '[0-9]' express.txtroot@ubuntu:/tmp# grep -n '[^[:lower:]]oo' express.txtroot@ubuntu:/tmp# grep -n '[[:digit:]]' express.txtroot@ubuntu:/tmp# grep -n '^the' express.txtroot@ubuntu:/tmp# grep -n '^[a-z]' express.txtroot@ubuntu:/tmp# grep -n '^[^a-zA-Z]' express.txtroot@ubuntu:/tmp# grep -n '\.$' express.txtroot@ubuntu:/tmp# grep -n '^$' express.txtroot@ubuntu:/tmp# grep -n 'g..d' express.txt(. 代表任意字符)root@ubuntu:/tmp# grep -n 'ooo*' express.txt (* 代表重复前一个字符, 0 到无穷多次”的意思,为组合形态)root@ubuntu:/tmp# grep -n 'o\{2\}' express.txt (限定连续 RE 字符范围 {})root@ubuntu:/tmp# grep -n 'go\{2,5\}g' express.txtroot@ubuntu:/tmp# grep -n 'go\{2,\}g' express.txt大家可以试着想一下这些是什么意思,可以在评论区回答一下,后续我会在评论区公布答案。

正则表达式下的sedroot@ubuntu:/tmp# sed [-nefr] [动作]

sed选项与参数:

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。

但如果加上 -n 参数后,则只有经过 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 :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!

例如 1,20s/old/new/g 就是啦!

光说不练假把式,使用hosts文件作为练习文件

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

hosts模板练习文件

注意:sed后面接的动作必须是''单引号哦示例一、删除2-5行 sed '2,5d'

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

删除2-5行

示例二、在第二行添加‘this is my host’ sed '2a this is my host'

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

sed添加功能

示例三、取代2-5行,sed '2,5c replace2-5'

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

sed取代功能

示例四、替换 sed 's/#/$/g' hosts 把文件hosts中的字符'#'全部替换成'$'

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

sed替换功能

示例五、从ifconfig指令中截取ip地址(这个综合性比较强,可以好好参考一下)

root@ubuntu:/tmp# ifconfig eth0 | grep 'inet '| sed 's/^.*inet addr://g'|sed 's/ .*//g'

管道命令grep、sed与正则表达式结合在一起让你玩转Linux?

ifconfig截取ip


分享到:


相關文章: