linux下正则表达式的相关知识

一、linux中正则表达式的特殊符号:

特殊符号 代表意义
[: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 的用途要确定的很!
 
二、基础的正则表达式特殊字符汇整如下:
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
 
三、grep 的一些进阶选项
[dmtsai@study ~]$ grep [-A] [-B] [--color=auto] '搜寻字串' filename
选项与参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
--color=auto 可将正确的那个撷取数据列出颜色
范例一:用 dmesg 列出核心讯息,再以 grep 找出内含 qxl 那行
[dmtsai@study ~]$ dmesg | grep 'qxl'
[ 0.522749] [drm] qxl: 16M of VRAM memory size
[ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain)
[ 0.522750] [drm] qxl: 32M of Surface memory size
[ 0.650714] fbcon: qxldrmfb (fb0) is primary device
[ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
# dmesg 可列出核心产生的讯息!包括硬件侦测的流程也会显示出来。
-n:整行列出查找到数据
-i:忽视大小写查找数据
【asd】:列出符号括号中的任意字符的
-v:反向选取
【^a】:除了a之外的任意字符(反向选取)
 '^the':行首匹配the字符(行首匹配)
 'a$':行尾匹配
 '^$':匹配空白行
【0-9a-zA-Z】:所有字符(不包含特殊字符)
  \:脱字符解除特殊字符的特殊意义
. (小数点):代表“一定有一个任意字符”的意思
*(星星号):代表“重复前一个字符, 0 到无穷多次”的意思,为组合形态
{}:限定范围的字符。{}在shell中又特殊意义需要用脱字符转换\{\}
 
四、sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代、删除、新增、撷取特定行等等
       sed 还可以用行为单位进行部分数据的搜寻并取代的功能喔! 基本上 sed 的搜寻与取代的与 vi 相当的类似!他有点像这样:
       sed 's/要被取代的字串/新的字串/g'
[dmtsai@study ~]$ sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。
但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令行界面上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正则表达式的语法。(默认是基础正则表达式语法)
-i :直接修改读取的文件内容,而不是由屏幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表“选择进行动作的行数”,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则“ 10,20[动作行为] ”
function 有下面这些咚咚:sed 后面接的动作,请务必以 '' 两个单引号括住
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!
例如 1,20s/old/new/g 就是啦!
示例:仅列出 /etc/passwd 文件内的第 5-7 行
[dmtsai@study ~]$ nl /etc/passwd | sed -n '5,7p'
/sbin/ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'    (仅仅显示ip)
sed 甚至可以直接修改文件的内容呢!而不必使用
管线命令或数据流重导向! 不过,由于这个动作会直接修改到原始的文件,所以请你千万不
要随便拿系统配置文件来测试喔
示例:利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
[dmtsai@study ~]$ sed -i 's/\.$/\!/g' regular_express.txt
# 上头的 -i 选项可以让你的 sed 直接去修改后面接的文件内容而不是由屏幕输出喔!
# 这个范例是用在取代!请您自行 cat 该文件去查阅结果啰!
示例:利用 sed 直接在 regular_express.txt 最后一行加入“# This is a test”
[dmtsai@study ~]$ sed -i '$a # This is a test' regular_express.txt
# 由于 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增啰!
 
五、延伸正则表达式:
       示例:我们要去除空白行与行首为 # 的行列,使用的是
       grep -v '^$' regular_express.txt | grep -v '^#'
       延伸型的正则表达式,我们可以简化为:
egrep -v '^$|^#' regular_express.txt
延伸正则表达式的特殊符号:
RE字符               意义与范例
+                  意义:重复“一个或一个以上”的前一个 RE 字符 范例:搜寻 (god) (good)
                  (goood)... 等等的字串。 那个 o+ 代表“一个以上的 o ”所以,下面的执行成果
                    会将第 1, 9, 13 行列出来。 > egrep -n 'go+d' regular_express.txt
?                  意义:“零个或一个”的前一个 RE 字符 范例:搜寻 (gd) (god) 这两个字串。
                    那个 o? 代表“空的或 1 个 o ”所以,上面的执行成果会将第 13, 14 行列出来。 有
                    没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想
                    看,这是为什么喔! ^_^ > egrep -n 'go?d' regular_express.txt
|                   意义:用或( or )的方式找出数个字串 范例:搜寻 gd 或 good 这两个字串,注
                    意,是“或”! 所以,第 1,9,14 这三行都可以被打印出来喔!那如果还想要找出
                    dog 呢? > egrep -n 'gd|good' regular_express.txt
                    > egrep -n 'gd|good|dog' regular_express.txt
()             意义:找出“群组”字串 范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与
                    d 是重复的,所以, 我就可以将 la 与 oo 列于 ( ) 当中,并以 | 来分隔开来,
                    就可以啦! > egrep -n 'g(la|oo)d' regular_express.txt
()+           意义:多个重复群组的判别 范例:将“AxyzxyzxyzxyzC”用 echo 叫出,然后再使
                    用如下的方法搜寻一下! > echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
 
六、文件打印格式化输出:
[dmtsai@study ~]$ printf '打印格式' 实际内容
选项与参数:
关于格式方面的几个特殊样式:
\a 警告声音输出
\b 倒退键(backspace)
\f 清除屏幕 (form feed)
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [tab] 按键
\v 垂直的 [tab] 按键
\xNN NN 为两位数的数字,可以转换数字成为字符。
关于 C 程序语言内,常见的变量格式
%ns 那个 n 是数字, s 代表 string ,亦即多少个字符;
%ni 那个 n 是数字, i 代表 integer ,亦即多少整数码数;
%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数,
假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
 
七、awk:数据处理工具:
awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较
倾向于一行当中分成数个“字段”来处理。因此,awk 相当的适合处理小型的数据数据处理呢!
awk 通常运行的模式是这样的:
[dmtsai@study ~]$ awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
awk 后面接两个单引号并加上大括号 {} 来设置想要对数据进行的处理动作。 awk 可以处理后
续接的文件,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是处
理“每一行的字段内的数据”,而默认的“字段的分隔符号为 "空白键" 或 "[tab]键" ”!举例来说,
我们用 last 可以将登陆者的数据取出来,结果如下所示:
[dmtsai@study ~]$ last -n 5 <==仅取出前五行
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)
awk的内置变量:
变量名称             代表意义
NF                       每一行 ($0) 拥有的字段总数
NR                      目前 awk 所处理的是“第几行”数据
FS                       目前的分隔字符,默认是空白键
[dmtsai@study ~]$ last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
 
八、文件比对工具:diff、cmp、patch
diff:就是用在比对两个文件之间的差异的,并且是以行为单位来比对的!一般是用在 ASCII 纯文本文件的比对上。 由于是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)
的新旧版本差异上!
[dmtsai@study ~]$ diff [-bBi] from-file to-file
选项与参数:
from-file :一个文件名,作为原始比对文件的文件名;
to-file :一个文件名,作为目的比对文件的文件名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表“Standard input”之意。
-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。
[dmtsai@study testpw]$ diff passwd.old passwd.new
cmp:通过字节对比文件大小
patch:这个指令与 diff 可是有密不可分的关系啊!我们前面提到,diff 可以用来分辨两个版本
之间的差异, 举例来说,刚刚我们所创建的 passwd.old 及 passwd.new 之间就是两个不同版
本的文件。 那么,如果要“升级”呢?就是“将旧的文件升级成为新的文件”时,应该要怎么做
呢? 其实也不难啦!就是“先比较先旧版本的差异,并将差异档制作成为补丁文件,再由补丁
文件更新旧文件”即可
   
pr:文件打印添加标签:
[dmtsai@study ~]$ pr /etc/man_db.conf
 
 

猜你喜欢

转载自www.cnblogs.com/-one/p/11944327.html