【Shell】基础正则表示法及grep用法

——《鸟哥的私房菜》git

正规表示法就是处理字串的方法,他是以行为单位来进行字串的处理行为;
正规表示法透过一些特殊符号的辅助,可让使用者轻易的达到『搜寻/删除/取代』某特定字串的处理程序;
只要工具程序支持正规表示法,那么该工具程序就能够用来做为正规表示法的字串处理之用;
正规表示法与万用字节是彻底不同的东西!万用字节 (wildcard) 表明的是 bash 操做介面的一个功能, 但正规表示法则是一种字串处理的表示方式!shell

 

grep 正规表示法里面是很常见也很经常使用的一个工具,他最重要的功能就是进行字串数据的比对,而后将符合使用者需求的字串列印出来。express

grep 在数据中查寻一个字串时,是以 "整行" 为单位来进行数据的撷取的!也就是说,假如一个文件内有 10 行,其中有两行具备你所搜寻的字串,则将那两行显示在萤幕上,其余的就丢弃了!bash

grep [-acinv] [-A] [-B] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不一样,因此大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
--color=auto :将找到的关键词部分加上颜色的显示
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来工具

 

基础正规表示法字符汇整编码

RE 字符 意义与范例
^word 意义:待搜寻的字串(word)在行首!
范例:搜寻行首为 # 开始的那一行,并列出行号
grep -n '^#' regular_express.txt
word$ 意义:待搜寻的字串(word)在行尾!
范例:将行尾为 ! 的那一行列印出来,并列出行号
grep -n '!$' regular_express.txt
. 意义:表明『必定有一个任意字节』的字符!
范例:搜寻的字串能够是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间『必定』仅有一个字节,而空白字节也是字节!
grep -n 'e.e' regular_express.txt
\ 意义:跳脱字符,将特殊符号的特殊意义去除!
范例:搜寻含有单引号 ' 的那一行!
grep -n \' regular_express.txt
* 意义:重复零个到无穷多个的前一个 RE 字符
范例:找出含有 (es) (ess) (esss) 等等的字串,注意,由于 * 能够是 0 个,因此 es 也是符合带搜寻字串。另外,由于 * 为重复『前一个 RE 字符』的符号, 所以,在 * 以前必需要紧接著一个 RE 字符喔!例如任意字节则为 『.*』 !
grep -n 'ess*' regular_express.txt
[list] 意义:字节集合的 RE 字符,里面列出想要撷取的字节!
范例:搜寻含有 (gl) 或 (gd) 的那一行,须要特别留意的是,在 [] 当中『谨表明一个待搜寻的字节』, 例如『 a[afl]y 』表明搜寻的字串能够是 aay, afy, aly 即 [afl] 表明 a 或 f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2] 意义:字节集合的 RE 字符,里面列出想要撷取的字节范围!
范例:搜寻含有任意数字的那一行!需特别留意,在字节集合 [] 中的减号 - 是有特殊意义的,他表明两个字节之间的全部连续字节!但这个连续与否与 ASCII 编码有关,所以,你的编码须要配置正确(在 bash 当中,须要肯定 LANG 与 LANGUAGE 的变量是否正确!) 例如全部大写字节则为 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list] 意义:字节集合的 RE 字符,里面列出不要的字串或范围!
范例:搜寻的字串能够是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,表明的意义是『反向选择』的意思。 例如,我不要大写字节,则为 [^A-Z]。可是,须要特别注意的是,若是以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该文件内的全部行都被列出,为何?由于这个 [^A-Z] 是『非大写字节』的意思, 由于每一行均有非大写字节,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字
grep -n 'oo[^t]' regular_express.txt
\{n,m\} 意义:连续 n 到 m 个的『前一个 RE 字符』
意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符,
意义:如果 \{n,\} 则是连续 n 个以上的前一个 RE 字符!
 范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt
注:由于 { 与 } 的符号在 shell 是有特殊意义的,所以, 咱们必需要使用跳脱字符 \ 来让他失去特殊意义才行

再次强调:『正规表示法的特殊字节』与通常在命令列输入命令的『万用字节』并不相同, 例如,在万用字节当中的 * 表明的是『 0 ~ 无限多个字节』的意思,可是在正规表示法当中, * 则是『重复 0 到无穷多个的前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!spa

举例来讲,不支持正规表示法的 ls 这个工具中,若咱们使用 『ls -l * 』 表明的是任意档名的文件,而 『ls -l a* 』表明的是以 a 为开头的任何档名的文件, 但在正规表示法中,咱们要找到含有以 a 为开头的文件,则必需要这样:(需搭配支持正规表示法的工具)ci

ls | grep -n '^a.*'字符串

.* 就表明零个或多个任意字节it

另外,那个 ^ 符号,在字节集合符号(括号[])以内与以外是不一样的! 在 [] 内表明『反向选择』,在 [] 以外则表明定位在行首的意义!

例如:grep -n '^[^a-zA-Z]' 意义是 不要开头是英文字母的行

 

另外,为了要避免编码所形成的英文与数字的撷取问题,所以有些特殊的符号咱们得要了解一下的! 这些符号主要有底下这些意义:

特殊符号 表明意义
[: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 的数字与字节
相关文章
相关标签/搜索