首页 > 代码库 > 正则表达式
正则表达式
文本处理工具:
Vim vi nano
文本处理三剑客
Grep系:grep,egrep,fgrep,文本搜索工具,基于“PATTERN”对于给定的文本进行模糊搜索,grep系默认工作于贪婪模式下
Sed:stream editor ,流编辑器,行编辑器,文本编辑工具
Awk:gawk——GUN awk,文本格式化工具,文本报告生成器,文本处理的编程语言,
Grep系:全称:Global search regular expression and print out the line
翻译汉语:利用正则表达式进行全局搜索并将匹配的行显示出来
语法结构:grep [OPTIONS] PATTERN [FILE...]
PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成
正则表达式的元字符:
会被正则表达式的引擎解释为特殊含义
公认最完整的引擎:pcre__perl语言的正则表达式引擎
基本的正则表达式:BRE
扩展的正则表达式:ERE
Grep默认情况下仅支持基本正则表达式
Egrep默认情况下仅支持扩展正则表达式
Fgrep:默认不开启正则表达式引擎
文本字符:
只具备字符便面含义的那些字符
选项:
-i, --ignore-case:忽略文本字符的大小写
-v, --invert-match:反向匹配,最终显示的结果是PATTERN不能成功匹配的行
-c, --count:计数,统计匹配PATTERN的所有行数
-o, --only-matching:关闭贪婪模式,仅显示PATTERN能匹配的内容
-q, --quiet, --silent:安静模式,不输出任何匹配结果
--color[=WHEN], --colour[=WHEN]:将匹配PATTERN的内容以特殊颜色亮度显示;
--color = auto
-E, --extended-regexp:扩展的正则表达式,grep -E相当于egrep
-F, --fixed-strings, --fixed-regexp:grep -F相当于fgrep
-G, --basic-regexp:基本的正则表达式,egrep -G 相当于grep
-P, --perl-regexp使用PCRE(perl common regular expression)引擎
-A NUM, --after-context=NUM:在显示匹配PATTERN的行的同时显示其后面的num行
-B NUM, --before-context=NUM在显示匹配PATTERN的行的同时显示其前面的num行
-C NUM, -NUM, --context=NUM:在显示匹配PATTERN的行的同时显示其前各num行
PATTERN:
正则表达式元字符:
基本的正则表达式元字符:
GLOBBING-----------------简化的正则表达式:[ ] ? *
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围以外的任意单个字符
下列所有的字符集都可以放置于[](中括号)中,用于匹配单个字符
[:lower:]
[:upper:]
[:alpha:]
[:digit:]
[:alnum:]
[:punct:]
[:blank:]
[:xdigit:]:所有的十六进制数字
a-z:所有的小写字母
A-Z:所有的大写字母
0-9:标识所有的十进制数字
次数匹配:该类字符之前的那个字符可以出现的次数
*(星号):其前门的字符可以出现任意次(0次,1次或多次)
\?(反斜线,问号):其前面的字符可有可无(0次或1次)
\+(反斜线,加号):其前面的字符至少出现一次(1次或多次)
\{m\}:其前面的字符必须出现m次
\{m,n\}:其前面字符至少出现m次,至多多现n次(m<n)
\{,n\}:其前面的字符至少出现0次,至多出现n次
\{m,\}:其前面的字符至少出现m次,多了不限
在正则表达式中,标识任意长度任意字符的方式:.*(小数点,星号)
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\< 或者 \b
字尾锚定:\> 或者 \b
\b:旧版本中的锚定方法,建议不使用
对于正则表达式引擎来说,字是由非
分组与引用字符:
\(PATTERN\):将此PATTERN所匹配的所有字符当作一个不可分割的整体来处理
在正则表达式引擎之中,有一系列的内置变量,这些变量会保存所有分组内字符信息,用于后向引用,这些变量依次是:\1,\2,\3,....
pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
\1:pattern2
\2:pattern4
\3:pattern5
\1:第一组小括号中的pattern匹配到的字符
\2:第二组小括号中的pattern匹配到的字符
请找出在/etc/passwd中用户的UID和GID相同的用户账户
grep ‘\(\<[[:digit:]]\+>\).*\1‘ /etc/passwd
或:
\|
注意:\|将其左右两边的字符串当作整体对待
A\american :A或american
请找出ifconfig命令执行结果中数值在100-255之间的整数
第一位:1 2
第二位:0-9 0-4 5
第三位:0-9 0-9 0-5
ifconfig | grep ‘\<1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\>‘
请找出ifconfig命令执行结果中数值在0-255之间的整数
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默认情况下,grep命令后面只允许有一个PATTERN
如果想要在一次grep所搜过程中写多个PATTERN,则需要使用-e选项,每个-e选项只能使用一个PATTERN作为参数;
将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN,我们就可以使用-f FILE方式来实现多PATTERN匹配
Egrep:
语法结构:grep [OPTIONS] PATTERN [FILE...]
扩展的正则表达式元字符:
字符匹配:
.
[]
[^]
次数匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置锚定:
^
$
\<,\b
\>,\b
分组和引用:
()
\1,\2,\3,...
或:
|
Fgrep:PATTERN中所有的字符都当作文本字符来处理ION;
其他的文本处理命令:
wc:
wc [OPTION]... [FILE]...
-l:只显示行数
-w:只显示字数
-c:只显示字符数
cut:remove sections from each line of files
能够被cut命令修剪的文件,一般都是具有一定结构或格式的文本文档:/etc/passwd
语法结构:cut OPTION... [FILE]...
选项:
-d, --delimiter=DELIM:在实施修剪操作时所依赖的分隔符,默认为空白符
-f, --fields=LIST:根据定义的分隔符来指定字段的编号,
地址定界使用方法:
#:选择被指定的单个字段
#,#:离散的多个被指定的单个字段
#-#:连续的多个被指定的字段
--output-delimiter=STRING:指定输出分隔符
awk:
awk -F "DELIMITER"‘[/PATTERN/]{print $1,$2....$NF}‘ FILE....
-F:"DELIMITER"指定字段分隔符,默认为空白字符
$1,$2,....$NF,根据字段分隔符切割出来的文本片段都存放在相应的内部变量中
sort:sort lines of text files:
翻译汉语:将文本文件按行急需排序,默认排序规则是按照ASCII表中的字符顺序进行,这个排序标准可修改
选项:
-r, --reverse:逆序排序
-R, --random-sort:随机排序,这种随机算法是非常简陋的,不适用于复杂环境
-u, --unique:重复出现的行,只保留一行(连续且完全相同的行重复)祛重
-n, --numeric-sort:以数字的数值大小进行排序
-t, --field-separator=SEP:指定字段分隔符
-k, --key=KEYDEF:指明根据哪个关键字段进行排序,一般和-t同时使用
uniq:report or omit repeated lines
-d, --repeated:只显示重复出现的行,而且每一组重复行只显示一行
-u, --unique:只显示不重复的行
-c, --count:在每行以前缀的方式显示重复行的重复次数
diff:compare files line by line
同一个文件的不同修改版本;打补丁
patch:apply changes to files
parch [-R][-i patchfile] [file]
编程语言:
问题空间:就是使用人类的自然语言描述的任务
解空间:就是使用编程语言描述任务的实施步骤和显示最终结果
编程思想:能够把编程语言所提供的语法格式,随时随地转换成能够解决问题的思路
对于编程语言的学习:
1.学习编程语言的语法格式
2.学习工具的使用(库,命令)
3.算法
4.数据结构
学习编程语言的目标:
将问题空间和解空间对应起来,最直接的办法就是使用解空间的语言习惯来进行思考;
shell脚本编程:
shell脚本的内容和格式:
首行,绝对行首,shebang(解释器程序的绝对路径)
注释信息,以#占据绝对行首的行
为了能够在程序中突出程序的功能,适当的添加空白行,以分隔不同功能的源代码块;
有一定的缩进
利用bash脚本编程实现算术运算:
+,-,
*,/,
%:模运算,取余数
**|^
增强型的算术元算符号:
+=:let B=B+2 ---> let B+=2
-=:let B-B=2 ---> let B-=2
*=:let B=B*2 ---> let B*=2
/=:let B=B/2 ---> let B/=2
%=:let B=B%2 ---> let B%=2
特殊的增强型算术运算:
let B=B+1 ---> let B+=1 ---> let B++
let B=B-1 ---> let B-=1 ---> let B--
B++:先将B的值赋给其他变量,然后自身+1
++B:先做自身+1,然后再将B值赋给其他变量
算术运算方法:
1.let VAR=算术表达式
将算术表达式先进行算术运算,并将运算得到的结果保存到变量VAR中
2.VAR=$[算术表达式]
算术表达式中有过有变量引用,可以使用$,也可以省略$;
例子:SUM=$[C+B]相当于SUM=$[$C+$B]
3.VAR=$[算术表达式]
算术表达式中如果有变量引用,可以使用$引用,也可以省略$
4.expr ARGU1 ARGU2 ARGU3
ARGU1和ARGU3必须是数值
ARGU2必须是运算符号
5.echo "算术表达式" | bc
注意:*号,在某些情况下需要转义;
例子:
统计/etc/fstab,/etc/passwd,/etc/issue三个文件中,以字母r开头的行数的总和;
echo $[`grep -c "^r" /etc/passwd`+`grep -c "^r" /etc/issue`+`grep -c "^r" /etc/fstab`]
变量:存储数据的容器
弱变量,弱类型变量,字符(默认)型,数值型(不包括浮点型)
条件测试命令:
test EXPRESSION
shell内建命令:
[ EXPRESSION ]
外部命令:
[[ EXPRESSION ]]
bash的内部关键字:
注意:这类命令一般没有执行结果,只有执行状态返回值
test测试命令有三类测试表达式:
1.数值测试:双目操作符
-eq:被测试的两个数值,是否相等,相等为真,不等为假;
-ne:被测试的两个数值,是否不相等,不等为真,相当为假
-gt:被测试的两个数值,左边的是否大于右边的,大于为真,不大于为假
-lt:被测试的两个数值,左边的是否小于右边的,小于为真,不小于为假
-ge:被测试的两个数值,左边的是否大于等于右边的,大于等于为真,小于为假
-le:被测试的两个数值,左边的是否小于等于右边的,小于等于为真,大于为假
例子:~/aaa的大小是否小于1000字节
[root@localhost 桌面]# [ $(ls -l aaa | awk ‘{print $5}‘) -lt 1000 ] && echo ok ||echo "bu ok"
2.字符串测试
==|=:被测试的两个字符串是否相同,相同为真,不同为假;
!=:被测试的两个字符是否相同,不同为真,相同为假
>:被测试的两个字符串在ASCII码表中对应的二进制数值,左边是否大于右边,大于为真,小于为假
<:被测试的两个字符串在ASCII码表中对应的二进制数值,左边是否小于右边,小于为真,大于为假
注意:>和<必须在[[ EXPRESSION ]](必须两个中括号,切有空格)测试语句中
=~:被测试的两个字符串,左侧字符串能否被右侧的PATTERN匹配,能匹配为真,不能匹配为假;
单目操作符:
-z ‘STRING‘:判断指定的字符串是否为空串,空为真,不空为假
-n ‘STRING‘:判断指定的字符串是否为非空串,非空为真,空为假
注意:
1.通常情况下,字符串要加引号,单引号或双引号,根据实际情况选择即可
2.[[]]和[]在某些情况下,可能意义不同;
3.表达式两端以及操作符两端都要有空格;
3.文件状态测试
文件的存在性测试,如果被测试的文件存在为真,不存在为假
-a | -e
[ -e /backup ]
[ -a /backup ]
文件类型测试(先测试存在性)
-b FILE:被测试的文件是否存在并且是否为块设备,存在且为块设备,否则为假
-c FILE:被测试的文件是否存在并且是否为字符设备,存在且为字符设备,否则为假
-d FILE:被测试的文件是否存在并且是否为目录文件,存在且为目录文件,否则为假
-f FILE:被测试的文件是否存在并且是否为普通文件,存在且为普通文件,否则为假
-h FILE:被测试的文件是否存在并且是否为符号链接文件,存在且为符号链接文件,否则为假
-L FILE:被测试的文件是否存在并且是否为符号链接文件,存在且为符号链接文件,否则为假
-p FILE:被测试的文件是否存在并且是否为管道文件,存在且为管道文件,否则为假
-S FILE:被测试的文件是否存在并且是否为套接字文件,存在且为套接字文件,否则为假
文件的访问权限测试;
-r FILE:被测试的文件是否存在并且当前有效账户是否可读,文件存在并且当前有用户可读为真,否则为假
-w FILE:被测试的文件是否存在并且当前有效账户是否可写,文件存在并且当前有用户可写为真,否则为假
-x FILE:被测试的文件是否存在并且当前有效账户是否可执行,文件存在并且当前有用户可执行为真,否则为假
文件的特殊权限标识测试:
-u FILE:被测试的文件是否存在并且是否设置了SUID权限,文件存在并且设置了SUID权限为真,否则为假
-g FILE:被测试的文件是否存在并且是否设置了SGID权限,文件存在并且设置了SGID权限为真,否则为假
-k FILE:被测试的文件是否存在并且是否设置了STICKY权限,文件存在并且设置了STICKY权限为真,否则为假
文件的所有权测试:
-O FILE:被测试的文件是否存在并且其属主是否为当前有效用户,有效为真,否则为假
-G FILE:被测试的文件是否存在并且其属组是否为当前有效用户的组,有效为真,否则为假
文件内容是否为空:
-s FILE:被测试的文件是否存在并且内容不为空,存在且内容不空为真,否则为假
时间戳测试:
-N FILE:被测试的文件自从上一次被修改之后,是否被修改过,修改过为真,否则为假
双目测试:
FILE1 -ef FILE2:测试两个文件是否指向同一个文件系统的相同inode的硬链接
FILE1 -ef FILE2:被测试的两个文件,FILE1是否比FILE2更新,更新为真,否则为假
FILE1 -ef FILE2:被测试的两个文件,FILE1是否比FILE2更旧,更旧为真,否则为假
测试语句中可以田间逻辑运算:
第一种表达方式:
[ -O /tmp/test ] && [ -s /tmp/test ]
[ -O /tmp/test ] || [ -s /tmp/test ]
第二种表达方式:
[ -O /tmp/test -a -s /tmp/test ]
[ -O /tmp/test -o -s /tmp/test ]
[!-O /tmp/test ]
命令的执行结果:
正常的输出结果:
命令的执行状态返回值:
0-255
0:表示命令执行成功
1,2,127:系统保留
3-126,128-255:用户自定义的执行状态返回值
exit[#]退出当前shell的登录
当shell脚本运行时,一旦遇到exit命令,将立即结束当前shell进程,同时脚本的运行也将被停止,即exit后面的所有命令都不再被解释执行;
正则表达式