这一节主要介绍正则表达式,以及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(借用鸟哥的文件)
示例一 、在express.txt中搜索'the',反向搜做’the‘(搜索不包含'the'的行)。
上图第一个命令是搜索’the‘并且高亮显示(高亮显示是因为在alias中grep做了--color=auto别名),第二个命令是"反向"查找'the',即显示出不含;'the'的行。
示例二、使用[]来搜索集合字符(常用)
[ae]指的是字符'a'或'e'。
示例三、在express.txt中搜索'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文件作为练习文件
注意:sed后面接的动作必须是''单引号哦示例一、删除2-5行 sed '2,5d'
示例二、在第二行添加‘this is my host’ sed '2a this is my host'
示例三、取代2-5行,sed '2,5c replace2-5'
示例四、替换 sed 's/#/$/g' hosts 把文件hosts中的字符'#'全部替换成'$'
示例五、从ifconfig指令中截取ip地址(这个综合性比较强,可以好好参考一下)
root@ubuntu:/tmp# ifconfig eth0 | grep 'inet '| sed 's/^.*inet addr://g'|sed 's/ .*//g'
閱讀更多 Python小飛豬 的文章