正则表达式
又称规则表达式,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
元字符 | 描述 |
\ | 转义符 |
^ | 匹配输入字行首 |
$ | 匹配输入行尾 |
* | 匹配前面的子表达式任意次 |
\{n\} | 匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 |
\{n,\} | n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。 |
\{n,m\} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。 |
.点 | 匹配除“\n”和"\r"之外的任何单个字符 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“[z|f]ood”则匹配“zood”或“food”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 |
\<\> | 匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。 |
| | 将两个匹配条件进行逻辑“或”(or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。 |
- 举例
- ^$ 匹配空行
- [^b-d] 匹配不在b-d范围内的所有字符
grep
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,
- 参数说明
-c:只输出匹配行的计数。
-i:不区分大小写。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
--color=auto :可以将找到的关键词部分加上颜色的显
- 举例
- grep ‘test’ d* 显示所有以d开头的文件中包含 test的行。
- grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行。
- grep ‘[a-z]\{5\}’ aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
- grep -r 明确要求搜索子目录:或忽略子目录:grep -d skip
- grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
- grep -l pattern files :只列出匹配的文件名
- grep -L pattern files :列出不匹配的文件名
- grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)
- grep -C number pattern files :匹配的上下文分别显示[number]行
- grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行
- grep "abc\|xyz" testfile 表示过滤包含abc或xyz的行
- grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
- grep -n pattern files 即可显示行号信息 grep -c pattern files 即可查找总行数
这里还有些用于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
sed
sed是一种流编编器,处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。接着理下一行,这样不断重复,直到文件末。
命令选项:
- -e 多个命令 在处理输入时,将多个命令中指定的命令添加到运行的命令中
- -f file 在处理输入时,将file中指定的内容添加到运行的命令中
- -n 不要为每个命令生成输出,等待print命令来输出
参数:
- p ##显示
- d ##删除
- a ##添加
- c ##替换
- i ##插入
- 举例
[root@server1 three]# sed -e 's/run/dance/;s/my/he/' info
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
[root@server1 three]# sed -f s info
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
[root@server1 three]# cat s
s/my/his/
s/run/dance/
[root@server1 three]# sed -n 's/gaoqi/her/p' info
her favourite sports is run.
awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
使用方法 : awk '{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
awk内置变量
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 |
|
常用的命令展示
- awk擅长列输出
搜索/etc/passwd有root关键字的所有行
1 |
|
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
1 |
|
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
1 |
|
使用printf替代print,可以让代码更加简洁,易读
1 |
|
打印/etc/passwd/的第二行信息
1 |
|
awk的过滤使用方法
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
多分隔符的使用:
1 2 |
|
1 |
|
查看最近登录最多的IP信息
1 |
|
利用正则过滤多个空格
1 |
|
awk编程--变量和赋值
除了awk的内置变量,awk还可以自定义变量, awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
统计某个文件夹下的大于100k文件的数量和总和
1 2 |
|
1 |
|
统计显示/etc/passwd的账户
1 2 3 |
|