一、正则表达式:Regular Expression
正则表达式:正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
作用:用一些特殊的字符来描述一个模式
正则是用于对文件中的内容进行过滤和匹配
通配符用于对文件名进行匹配
注意:在匹配模式中一定要加上引号
二、符号:
^ 以开头
$ 以结尾
^12$ 以1开头以2结尾
^$ 空行
. 表示任意的一位字符(数字、字母、符号)
+ 表示其前面的字符至少重复一次,可以是无数次
? 表示其前面的字符出现最多一次的情况,可以是0次
* 重复任意次数(包括0次)
.* 表示任意长度的任意字符
{}
{数字} 重复数字次,准确的重复多少次
{数字1,数字2} 至少重复数字1次,最多重复数字2次
{数字,} 至少重复数字次,最多不限
{,数字} 最多重复数字次,最少不限
[] 表示范围,多个范围使用 , 分隔
[^字符] 表示匹配[^字符]之外的任意一个字符
^[^] 匹配不是中括号内任意一个字符开头的行
[0-9] 表示1位数字(0-9任意数字)
[a-z] 表示1位小写字母
[A-Z] 表示1位大写字母
[0-9,a-z,A-Z]
() 表示内部是一个整体
| 表示或者
三、常用的正则表达式
1、车牌号码
^[A-Z][0-9,A-Z]{5}$
2、手机号码
^1[0-9]{10}$
3、身份证号
^[0-9]{17}[0-9,X]$
4、IP(0-255.0-255.0-255.0-255)
0-9 [0-9]
10-99 [1-9][0-9]
100-199 1[0-9][0-9]
200-249 2[0-4][0-9]
250-255 25[0-5]
方法一:^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
方法二:^([0-9]\.|[1-9][0-9]\.|1[0-9][0-9]\.|2[0-4][0-9]\.|25[0-5]\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
5、密码(8位以上,包含数字、大小写字母)
egrep [a-z] passwd | egrep [A-Z] | egrep [0-9] | egrep ^.{8,}$
四、grep
作用:用于对文件中的内容进行过滤
原理:逐行对文件中的内容根据样式进行匹配,如果匹配成功就过滤出该行
格式:grep [options] PATTERN file
PATTERN:要匹配的模式
参数:
-e =正则 用正则表达式来进行匹配操作,egrep=grep -e用grep调用正则表达式
-f =文件 从文件中取得条件
-i 忽略文件中内容的大小写
-n 打印包含匹配项的行和行标
-o 只输出匹配的选项(不显示整行)
-w 完全匹配字词(精确匹配)
-x 仅完全匹配一行
-c 抑制正常输出;而是为每个输入文件打印匹配线的计数。
-v 取反
-V 显示版本信息
--color 将匹配到的内容进行着色
--help 显示帮助
-B NUM 显示匹配到的条件的之前 数字 行
-A NUM 显示匹配到的条件的之后 数字 行
-C NUM 显示匹配到的条件的为中心上下 数字 行
-NUM 等于-C
例子:
1、显示出test中不包含字母c的行
[root@ren4 ~]# grep -v "c" test
2、统计test中包含字母a的行的数量
[root@ren4 ~]# grep "a" test | wc -l
3、过滤出包含大写字母的行
[root@ren4 ~]# grep '[A-Z]' test
4、匹配非数字字符
[root@ren4 ~]# grep '[^0-9]' test
5、查看包含字母a的行,要求显示该行上下各2行
[root@ren4 ~]# grep --color -C 2 'a' test
6、过滤出一行中a在前,v在后的行
[root@ren4 ~]# grep --color 'a.*v' test
7、匹配a和b之间有最少2个c最多5个c的行
[root@ren4 ~]# grep "ac\{2,5\}b" test
accccb
[root@ren4 ~]# egrep "ac{2,5}b" test
accccb
8过滤出以#为开头,且第二个字符是空格的行
[root@ren4 ~]# grep "^#[[:space:]]" test
[root@ren4 ~]# grep "^#[:space:]" test
grep: 字符类的语法是 [[:space:]],而非 [:space:]
9过滤出行首和行尾字母相同的行
[root@ren4 ~]# grep "^\([a-z]\).*\1$" test
adfdfa
[root@ren4 ~]# egrep "^([a-z]).*\1$" test
adfdfa
10、过滤出第一个字符是#,且第二个字符串是非空字符,而且结尾是数字的行
[root@ren4 ~]# grep --color "^#[^[:space:]].*[0-9]$" test
正则练习:
使用文件 /etc/init.d/functions ,下面可能有些部分题目匹配不到符合的情况。
1. 过滤出包含大写字母的行
[root@ren4 ~]# egrep "[A-Z]" /etc/init.d/functions
2. 匹配非数字字符
[root@ren4 ~]# egrep "[^0-9]" /etc/init.d/functions
3. 过滤出一行中a在前,b在后的行
[root@ren4 ~]# egrep "a.*b" /etc/init.d/functions
4. 匹配a和b之间有最少2个c最多5个c的行
[root@ren4 ~]# egrep "ac{2,5]b" /etc/init.d/functions
5. 过滤出一行包含相同数字的行/etc/init.d/functions
[root@ren4 ~]# egrep ".*([0-9]).*\1" /etc/init.d/functions
五、awk
功能:通过正则表达式,得到需要的行,列信息
语法:
awk -F分隔符号 '{print $列数}' #-F可以不写,默认使用空格分隔
awk -F分隔符 '{print $列数}' 文件名 #可以直接过滤文件,但不会对源文件内容进行更改
#列说明 $0所有列 $数字 第数字列
示例:
1.用 awk 打印所有包含有 root 字段的行
awk '/root/' passwd
2.查看 df -h 命令的第 2 列
#df -h | awk '{print $2}'
3. 查看 df -h 命令的第 2,5 列
df -h | awk '{print $2,$5}'
4.显示 passwd 的第四行
awk 'NR==4' passwd
5.打印 ls –l / 中包含 etc字段行的第二区域
ls -l / | awk '/etc/ {print $2}'
6.列示月份及年份 (\n 为换行符 )
date | awk '{print "Year:" $1 "\nMonth:" $2}'
7.在有 root 关键字的行的第 1 列后面增加 1 个 \t制表符 , 并增
加 RedHat, 第 2 列后面加 ! 字符
24-awk
加 RedHat, 第 2 列后面加 ! 字符
awk '/root/ {print $1 "\tRedHat Linux" $2 "!"}' passwd
8.在有 root字段的行前增加记录号 ($0 为行头前 )
awk '/root/{print NR,$0}' passwd
9.以:分割,匹配第一列的 root字段,如果有,则显示整行
awk -F ":" '$1 ~ /root/' passwd
10.以:分割,匹配第一列不存在 root字段的行,如果有,则显
示行号和第一列
awk -F ":" '$1 !~ /root/ {print NR,$1}' passwd
11. 在结果前打印 hello,可以是任何的字符
awk 'BEGIN{print "hello"}{print $0}' passwd
12. 在结果后打印 hello,可以是任何的字符
awk 'END{print "hello"}{print $0}' passwd
13.使用awk进行计算 +加 -减 *乘 /除 可以带() ^开方
awk 'BEGIN{print 2*3}'
14.比较 >大于 <小于 >=大于等于 <=小于等于 ==等于
awk -F ":" '$3<=88{print $1,$3}' passwd
命令 : cut
功能 : 对所需字符进行截取
参数
-d “n”: 定义分界符 , 即点位
-f n: 取第几位的字符
示例:
1.以:为分隔符,截取第一列。
cut -d ':' -f 1 passwd
2.以:为分隔符,截取第一和第七列。
cut -d ':' -f 1,7 passwd
分区 初级 的第 84 页
cut -d ':' -f 1,7 passwd
命令 :sort
功能 : 默认以排序 ASCII 方式进行排序 [a-z]
参数 :
-u 去除重复的行
-r 降序排序 [z-a]
-n 数值排序
-k 以文本的列进行判断
-t 设定分界符
示例 :
1.对 /etc/passwd 文件进行升序排序
sort /etc/passwd
2.对 /etc/passwd 文件进行降序排序
sort -r /etc/passwd
3.对 /etc/passwd 第 3 列进行数值排序 , 分界符为 :
sort -n -k 3 -t : /etc/passwd
4.对第 1 列的第 2 个字符开始至本列最后 1 个字符排序
sort -k 1.2 -t : /etc/passwd
命令 :wc
功能 : 统计行数、字数、字符数、文件总统计数
参数 :
-l 统计行数
-c 统计字节数
-w 统计字数 ( 单词数 )
六、sed
功能:通过指定的正则表达式完成指定关键字的过滤、截取、修
改等操作
语法格式:
sed ‘command’ filename(s)
特点:
1.sed属于一个流线式的非交互式的编辑器
2. sed在输入命令和文件名后,将在屏幕上输出
3.在不用重定向至文件之前,是不会改变文件现有内容。以避免
修改文件时出现问题
选项:
p 查看文件
d 删除内容
a 行的下方追加文字
i 行的上方插入文字
s 替换单词
c 替换行
y 替换字母
-e 执行多个条件
-f 调用条件文件
-n 抑制内存输出
-i 修改文件
\t tab键
\t tab键
\n 换行
/数字 第数字个
/g 全文
/w 写入另一个文件
/p 打印
'=' 给每行增加行号
-n '$=' 统计行数
-r 正则
示例:
sed -n 'p' passwd
#查看文件
sed 'aHELLO world' passwd
#在每一行下面添加
sed '5aHELLO world' passwd
#在第5行下添加
sed '2,4aHELLO world' passwd
#在2、3、4行下添加
sed '5iHELLO world' passwd
#在5行上方添加
sed '2,4iHELLO world' passwd
sed '3aHELLO world\nHELLO world' passwd
#换行
sed '3aHELLO world\n\t\tHELLO world' passwd
#换行+tab+tab
sed 'd' passwd
sed '3d' passwd
sed '3,5d' passwd
分区 初级 的第 88 页
sed '3,5d' passwd
sed 's/root/ROOOOT/' passwd
#替换,默认只替换查找到的第一个词
sed '3cHELLO world' passwd
#行的替换
sed 'y/s/S/' passwd
#字母替换,默认替换所有适配字母。
sed -e '10s/root/ROOT/;10s/sbin/BIN/' passwd
#多条件执行
sed -i 's/nologin/NOLOGIN/' passwd
#修改文件,脚本常用 默认是全局修改
sed 's/root/good/2' passwd
#指定替换第几个词
sed 's/root/good/g' passwd
#全局
sed 's/root/good/gw file1' passwd
#重定向替换后的文件
sed 's/root/good/2w file2' passwd