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 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 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