正则表达式与文件格式化处理知识要点

1、使用正则表达式时,需要特别留意当时环境的语系是什么,否则可能会发现与别人不相同的选取结果。

2、特殊符号:

特殊符号代表意义
[: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:]代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符

3、grep的一些高级选项

grep [-A] [-B] [--color=auto} '查找字符‘ filename

参数:

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

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

–color=auto:对正确选取的数据着色

例如:

[root@vidar-ali ~]# dmesg | grep 'EDAC'
[    0.232098] EDAC MC: Ver: 3.0.0
[    6.754272] EDAC sbridge: Seeking for: PCI ID 8086:6fa0
[    6.754276] EDAC sbridge:  Ver: 1.1.2 

[root@vidar-ali ~]# dmesg | grep -n 'EDAC'
274:[    0.232098] EDAC MC: Ver: 3.0.0
512:[    6.754272] EDAC sbridge: Seeking for: PCI ID 8086:6fa0
513:[    6.754276] EDAC sbridge:  Ver: 1.1.2 

[root@vidar-ali ~]# dmesg | grep -n -A3 -B2 'EDAC'
272-[    0.232016] usbcore: registered new interface driver hub
273-[    0.232029] usbcore: registered new device driver usb
274:[    0.232098] EDAC MC: Ver: 3.0.0
……………………(略)
515-[   12.378826] random: crng init done
516-[   12.438852] EXT4-fs (vda1): resized filesystem to 10484164

4、grep在数据中查询一个字符串时,是以【整行】为单位来进行数据的选取

5、通过grep查找文件中test和taste这两个关键词

[root@vidar-ali ~]# grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.

6、查找不是以小写字母开头的oo字符串

[root@vidar-ali ~]# grep -n '[^a-z]oo' regular_express.txt 
3:Football game is not use feet only.

或者

[root@vidar-ali ~]# grep -n '[^[:lower:]]oo' regular_express.txt 
3:Football game is not use feet only.

7、查找开头是小写字符的那一行

[root@vidar-ali ~]# grep -n '^[a-z]' regular_express.txt 
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.

或者

[root@vidar-ali ~]# grep -n '^[[:lower:]]' regular_express.txt 
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.

8、注意:那个^符号,在字符集合符号(括号[ ])之内与之外是不同的。在[ ] 内代表方向选择,在 [ ] 之外则代表定位在行首的意义。

9、查找行尾结束为小数点(.)的那一行

[root@vidar-ali ~]# grep -n '\.$' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
11:This window is clear.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
20:go! go! Let's go.

10、grep查找空白行

[root@vidar-ali ~]# grep -n '^$' regular_express.txt 
22:

11、除去空白行、#开头的查找
例如:

[root@vidar-ali ~]# grep -v '^$' /etc/rsyslog.conf | grep -v '^#'
#第一个代表不要空白行,第二个代表不要#开头的那行。
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$WorkDirectory /var/lib/rsyslog
……

12、任意一个字符.与重复字符
. (小数点):代表【一定有一个任意字符】的意思;
/*/ (星星号):代表【重复前一个字符,0到无穷多次】的意思,为组合状态。

13、查找需要至少2个o以上的字符串时,就需要ooo +*,例如:

[root@vidar-ali ~]# grep -n 'ooo*' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!

14、查找开头与结尾都是g,但是两个g之间仅能存在至少一个o,即gog、goog、gooog等

[root@vidar-ali ~]# grep -n 'goo*g' regular_express.txt 
18:google is the best tools for search keyword.
19:goooooogle yes!

15、查找文件中g开头,g结尾的字符串

[root@vidar-ali ~]# grep -n 'g.*g' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.

因为*是0或多个重复前面的字符,而 . 是任意字符,所以:【. *就代表零个或多个任意字符】的意思

16、查找任意数字的行列

[root@vidar-ali ~]# grep -n '[0-9][0-9]*' regular_express.txt 
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.

17、限定连续RE字符范围{ }
①因为{ 与 } 的符号在shell是有特殊意义的,因为,必须使用转义符\ 来让它失去原有的意义。
②查找两个o的字符串

[root@vidar-ali ~]# grep -n 'o\{2\}' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!

③找出g后面接2到5个o,然后再接一个g的字符串

[root@vidar-ali ~]# grep -n 'go\{2,5\}g' regular_express.txt 
18:google is the best tools for search keyword.

④找出2个o以上的goooo…g

18:google is the best tools for search keyword.
19:goooooogle yes!

18、基础正则表达式字符合集

RE
字符
意义与范例
^word意义:待搜寻的字串(word)在行首!
范例:搜寻行首为#开始的那一行,并列出行号
grep -n ‘^#’ regular_express.txt
word$意义:待搜寻的字串(word)在行尾!
范例:将行尾为!的那一行列印出来,并列出行号
grep -n ‘!$’ regular_express.txt
.意义:代表『一定有一个任意字元』的字符!
范例:搜寻的字串可以是(eve) (eae) (eee) (ee),但不能仅有(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

19、强调:正则表达式的特殊字符与一般在命令行输入命令的通配符并不相同。

20、sed工具

①强大的地方
擅长对数据行进行处理,sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。利用sed命令可以将数据行进行替换、删除、新增、选取等特定工作。

②用法

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一般有以下参数:
a:新增,后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c: 替换,后面可以接字符串,这些字符串可以替换 n1,n2 之间的行
d:删除
i:插入,后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p:打印,将某个选择的数据打印出来。通常跟参数-n 一起运行
s:替换,用一个字符串替换另一个,注意与c参数的区别

⑦sed后面接的操作,无比以两个单引号括住。

⑧如果增加命令增加不止一行,以【\】划分

⑨仅列出某几行数据,记得要用-n,不然会默认全部输出的

⑩sed可以直接修改文件内容,慎用,例如将文件每一行的的.换成!

[root@vidar-ali ~]# sed -i 's/\.$/\!/g' regular_express.txt 

21、nl (Number of Lines) 将指定的文件添加行号标注后写到标准输出。如果不指定文件或指定文件为"-" ,程序将从标准输入读取数据。

nl [选项]... [文件]...

22、扩展正则表达式
①+ :表示重复【一个或一个以上】的前一个 RE 字符
例如:

[root@vidar-ali ~]# egrep -n 'go+d' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
13:Oh!	My god!

②? : 表示重复【零个或一个】的前一个RE 字符
例如:

[root@vidar-ali ~]# egrep -n 'go?d' regular_express.txt 
13:Oh!	My god!
14:The gd software is a library for drafting programs.

③| :表示用或的方式找出数个字符串

[root@vidar-ali ~]# egrep -n 'gd|good|dog' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
14:The gd software is a library for drafting programs.
17:I like dog.

④ () : 表示找出群组字符串

[root@vidar-ali ~]# egrep -n 'g(la|oo)d' regular_express.txt 
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
16:The world <Happy> is the same with "glad".

⑤()+ : 多个重复群组判别

#例子的意思是找开头是A结尾是C,中间有一个以上的“xyz”字符串的意思
[root@vidar-ali ~]# echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
AxyzxyzxyzxyzC

23、格式化打印:printf
用于将数据进行格式化

printf   '打印格式'   实际内容

参数:
\a:警告声音的输出
\b:退格键
\f:清除屏幕
\n:换行
\r:回车键
\t:水平的tab键
\v:垂直的tab键
\xNN:NN为数字,可以将十六进制的数字转换为字符
C语言变量格式
%ns:n为数字,s位字符串。输出多少位字符
%ni:n为数字,i为整型。输出多少位整型
%N.nf:N,n都是数字。f为浮点型。N为整数部分位数,n为小数部分位数(小数点.也算)

24、数据处理工具:awk
①awk 也是一个非常棒的数据处理工具!sed 常常用于一整个行的处理, awk 则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运行的模式是这样的:

[root@www ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

②awk是以行为一次处理的单位,而以字段为最小的处理单位。

变量名称代表意义
NF每一行($0)拥有的字段总数
NR目前awk所处理的是第几行数据
FS目前的分隔字符,默认是空格键

例如:

[root@vidar-ali ~]# last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'
root	 lines:1	 columns:10
root	 lines:2	 columns:10
root	 lines:3	 columns:10
root	 lines:4	 columns:10
root	 lines:5	 columns:10
	     lines:6	 columns:0

③awk格式内容如果想要以print打印时,记得非变量的文字部分,包含一小节printf提到的格式中,都需要使用双引号来定义出来
④awk当中,变量可以直接使用,不需加上$符号
⑤所有awk操作都在{ }内执行,多个命令可用分号或者回车间隔。

25、diff主要是以【行】为单位对比,cmp则是以字节为单位去对比,这并不相同


参考博客:
https://www.cnblogs.com/wuchaodzxx/p/5678709.html
https://blog.csdn.net/vicky198/article/details/79960166
https://www.cnblogs.com/ruanbo/p/9069500.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值