一、正则表达式
主要用来匹配字符串(命令结果,文本内容),
通配符匹配文件(而且是已存在的文件)
-
基本正则表达式
-
扩展正则表达式
1.元字符
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[zhou] [0-9] [] [a-zA-Z] [[:alpha:]] [0-9a-zA-Z]= [:alnum:]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
[:space:] 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
2.表示次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符 不包括0次
\? 匹配其前面的字符出现0次或1次,即:可有可无
\+ 匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次,<=n
\{n,\} 匹配前面的字符至少n次
注:如果是扩展正则表达式,不需要加转义字符\
例:
3.位置锚定
^ 行首锚定, 用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行 (单独一行 只有root)
^$ 空行
^[[:space:]]*$ 空白行 tab 换行 回车
\< 或 \b 词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
例:
4.分组
分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, … 分组
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
例:
echo abccc |grep "abc\{3\}"
abccc
echo abcabcabc |grep "\(abc\)\{3\}"
#分组 匹配abc
abcabcabc
ifconfig ens33 |grep netmask|grep -Eo '([0-9]{1,3}.){4}'
192.168.91.100
二、sed
sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
sed原理
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。
sed基本用法
sed格式
sed [选项]… “sed脚本” [输入文件]…
常用选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
sed脚本格式
sed脚本由’地址+命令’组成
1.命令
p:打印,如果是同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。
d:删除,删除选定的行
a:增加,在当前行下面增加一行指定内容
i:插入,在指定行上面插入一行指定内容
c:替换,将指定的行替换为指定内容(整行替换)
2.地址
1、不给地址,那么就是针对全文处理
2、单地址,表示#,指定的行,$表示最后一行,/pattter/:表示该模式能匹配到的每一行
3、地址范围:
#,# 从第几行到第几行
#,+#从第几行开始,往后加4行
/patter1/,/patter2/ 表示从第一个开始找,到第二个结束
3、步进:~
1~2:表示奇数行
2~2:表示偶数行
3~3:表示可以3的倍数行
4.分组后项引用
虽然sed是用来一行一行处理的,但是还是可以利用分组后项引用的办法来提取有相同标志的列
两种方式:①先匹配关键字的前后部分有什么特点,②找到关键字的特点,将整行用正则表达式采用分组表示
sed面试题
1.使用sed的分组后项引用来提取ip地址
sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.20.8
2.提取版本号
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
cat 11 | sed -rn 's/.*-([0-9.]+).jar/\1/p'
3.提取文件的权限
将11文件的权限0644提取出来
[root@localhost ~] stat 11
文件:"11"
大小:255 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:34738973 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-05-15 15:57:30.809345248 +0800
最近更改:2024-05-15 15:57:01.088115377 +0800
最近改动:2024-05-15 15:57:01.088115377 +0800
创建时间:-
[root@localhost ~] stat 11 | sed -rn 's/.*\(([0-9]+)\/.*/\1/p'
0644
*注:表示(和/原来的意思一定要加上转义字符*