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 字符
<完>