linux学习---正则表达式与grep

正则表达式(Regular Expression(RE))

是透过一些特殊字符的排列, 用以"搜寻/取代/删除"一列或多列文字字符串, 简单的说, 正则表达式就是用在字符串的处理上面的一项"表达式". 正则表达式并不是一个工具程序, 而是一个字符串处理的标准依据, 如果想要用用正则表达式处理字符串, 就要使用支持正则表达式的工具程序, 这样的程序有很多, 如vi, awk, grep, sed...

grep

基本规则:

grep [-acinv] [--color=auto] '搜寻字符串' filename

选项与参数:

  -a: 将binary档案以text档案方式搜寻数据

  -c: 计算找到'搜寻字符串'的次数

  -i: 忽略大小写

  -n: 输出行号

  -v: 反向选择, 即显示没有'搜寻字符串'内容的行

示例

1. 将last中, 出现root的那一行取出来

last | grep 'root'

2. 与1相反, 只要没有root的行

last | grep -v 'root'

3. 取出/etc/man.config内含MANPATH的那几行并显示行号

grep --color=auto 'MANPATH' -n /etc/man.config

加上--color=auto选项, 找到的关键词部分会用特殊颜色显示.

进阶

规则:

grep [-A] [-B] [--color=auto] '搜寻字符串' filename

选项与参数:

  -A: 后面可加数字, 为after的意思, 除了列出该行外, 后续的n行也列出来

  -B: 后面可加数字,为befer的意思, 除了列出该行外, 前面的n行也列出来

示例

1.

dmesg | grep -n --color=auto 'eth'

dmesg可列出核心产生的讯息, 透过grep取网络卡相关信息(eth).

2. 承上题, 将关键词所在行的前俩行与后三行也一起显示:

dmesg | grep -n -A3 -B2 --color=auto 'eth'

3.利用中括号[]搜寻集合字符

如果想要搜寻 test 或 taste 这两个单字时,可以发现,其实它们有共通的 't?st' 存在, 这个时候,
我可以这样来搜寻:

grep -n 't[ae]st' filename

4.我们可以使用, 

grep -n 'oo' filename

来搜寻包含'oo'的行, 这样可能或搜寻一堆包含单词good, food...的行, 如果我们不想要'oo'前面有'g'呢? 这时可以用集合字符的反向选择[^]:

grep -n '[^g]oo' filename

如果不想要'oo'有小写字母, 我们可以这样写:

grep -n [^a-z]oo' filename

也就是说,对于连续的母或数字,可以这样写[a-z], [A-Z], [0-9].

 考虑到语系对对于编码顺序的影响, 所以连续编码除了使用'-'外, 上例也可以使用这样的方法:

grep -n '[^[:lower:]]oo' filename

其他的符号:

  [: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 的数字与字符

行首与行尾符^$

如果想找只在行首出现字符串'the'的行, 可以这样:

grep -n '^the' filename

如果需要开头是小写字母的行:

grep -n '^[[:lower:]]' filename

不想要开头是字母:

grep -n '^[^a-zA-Z]' filename

注意到^在[]内外意义是不同的, 在内表示反向选择, 在外表示定位在行首.

如果想找行尾是'.'的行:

grep -n '\.$' filename

要注意的是.需要转义字符\.

搜寻空白行:

grep -n '^$' filename

也就是说从行首到行尾没有东西.

任意一个字符 . 不重复字符 *

. (小数点): 代表"一定有一个任意字符"的意思

 * (星星号): 代表"重复前一个 0 到无穷多次"的意思,为组合形态

示例:

假设我需要找出含g??d 的字符串,亦即共有四个字符, 起头是 g而结束是 d ,我可以这样做:

grep -n 'g..d' filename

因为 * 代表的是"重复 0 个戒多个前面的 RE 字符"的意义, 因此,"o*"代表的是: "拥有空字符或一个 o 以上的字符"

如果要查除有俩个g, 俩个g之间至少有一个以上的o字符串, 可以这样:

grep -n 'goo*g' filename

限定连续 RE 字符范围 {}

我们需要限定一定范围以内的字符数, 例如俩个g内含有2个到5个o:

grep -n 'go\{2,5\}g' filename

2个以上的o:

grep -n 'go\{2,\}g' filename

总结

^word

意义: 待搜寻的字符串(word)在行首!

word$

意义: 待搜寻的字符串(word)在行末

.

意义: 一定有一个任意字符

^word

意义: 待搜寻的字符串(word)在行首!

/

意义: 转义字符

*

意义:重复零个到无穷多个癿前一个 RE 字符

[ ]

意义: 带搜寻字符集, 只从里面取一个

[n1-n2]

意义: 字符集合的RE 字符,里面列出想要撷取的字符范围

[^list]

意义:字符集合的RE 字符,里面列出不要的字符串或范围

\{n,m\}

意义:连续 n 到 m 个的前一个 RE 字符

意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符

意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符

<完>

 

 

 

 

posted @ 2014-05-20 10:07  TonyZheng  阅读(243)  评论(0编辑  收藏  举报