Shell正则表达式

一、正则表达式
1、正则表达式是什么
#正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

2、正则表达式与通配符
#正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
#通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

通配符
— * 匹配任意内容
— ? 匹配任意一个内容
— [] 匹配中括号中的一个字符

3、基础正则表达式
Based on regular expressions

1)”.”匹配除了换行符任意一个字符

"s..d"
#"s..d"会匹配在s和d这两个字母之间一定有两个字符的单词
"s.*d"
#匹配s和d字母之间有任意字符
".*"
#匹配所有内容

2)”^”匹配行首,”$”匹配行尾

"^M"
#匹配以大写“M”开头的行
"n$"
#匹配以小写"n"结尾的行
"^$"
#会匹配空白行

3)”[]”匹配中括号中指定的任意一个字符,只匹配一个字符

"s[ao]id"
#匹配s和i字母中,要不是a、要不是o
"[0-9]
#匹配任意一个数字
"^[a-z]"
#匹配用小写字母开头的行

4)”[^]”匹配除中括号的字符以外的任意一个字符

"^[^a-z]"
#匹配不用小写字母开头的行
"^[^a-aA-Z]"
#匹配不用字母开头的行

5)”\”转义符

"\.$"
#匹配使用"."结尾的行

6)”\{n\}”表示其前面的字符恰好出现n次

"a\{3\}"
#匹配a字母连接出现三次的字符串
"[0-9]\{3\}"
#匹配包含连续的三个数字的字符串

7)”\{n,\}表示其前面的字符出现不小于n次

"^[0-9]\{3,\}[a-z]
#匹配最少用连续三个数字开头的行

8)”\{n,m\}”匹配其前面的字符至少出现n次,最多出现m次

"sa\{1,3\}i"
#匹配在字母s和字母i之间有最少一个a,最多三个a

4、例子

[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
#匹配日期格式YYYY-MM-DD

[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
#匹配IP地址

二、字符截取命令
1、cut字段提取命令
[root@localhost ~]# cut [选项] 文件名
选项:
— -f 列号:提取第几列
— -d 分隔符:按照指定分隔符分割列

cut命令的局限
— df -h | cut -d ” ” -f 1,3

2、printf命令
printf ‘输出类型输出格式’ 输出内容

输出类型:
— %ns:输出字符串。n是数字指代输出几个字符
— %ni:输出整数。n是数字指代输出几个数字
— %m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数如%8.2f代表共输出8位数,其中2位是小数,6位是整数。

输出格式:
— \a:输出警告声音
— \b:输出退格键,也就是Backspace键
— \f:清除屏幕
— \n:换行
— \r:回车,也就是Enter键
— \t:水平输出退格键,也就是Tab键
— \v:垂直输出退格键,也就是Tab键

例:

[root@localhost ~]# printf %s 1 2 3 4 5 6
[root@localhost ~]# printf %s %s %s 1 2 3 4 5 6
[root@localhost ~]# printf '%s %s %s' 1 2 3 4 5 6 
[root@localhost ~]# printf '%s %s %s\n' 1 2 3 4 5 6 

[root@localhost ~]# printf '%s' $(cat student.txt)
#不调整输出格式

[root@localhost ~]# printf '%s\t%s\t%s\t%s\n $(cat student.txt)
#调整格式输出

在awk命令的输出中支持print和printf命令
— print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
— printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

3、awk命令
# awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern)
— 一般使用关系表达式作为条件
— x>10判断变量 x是否大于10
— x>=10大于等于
— x<=10小于等于
动作(Action)
— 格式化输出
— 流程控制语句

例:

[root@localhost ~]# vim student.txt
student.txt content
ID      Name    gender  Mark
1       furong  F       85
2       fengj   F       60
3       cang    F       70
[root@localhost ~]# awk '{printf $2 "\t" $4 "\n"}' student.txt
[root@localhost ~]# df -h | awk '{print $1 "\t" $3}'

BEGIN
[root@localhost ~]# awk ‘BEGIN{printf “This is a transcript \n”} {printf $2 “\t” $4 “\n”}’ student.txt

END
[root@localhost ~]# awk ‘END{printf “The End\n”} {printf $2 “\t” $4 “\n”}’ student.txt

FS内置变量
[root@localhost ~]# cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=”:”}{printf $1 “\t” $3 “\n”}’

关系运算符
[root@localhost ~]# cat student.txt | grep -v Name | awk ‘$4>=70{printf $2 “\n”}’

4、sed命令
#sed 是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

sed [选项] '[动作]' 文件名
选项:
-- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕。
-- -e:允许对输入数据应用多条sed命令编辑
-- -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。

动作:
— a:追加,在当前行后添加一行或多行
— c:行替换,用c后面的字符串替换原数据行
— i:插入,在当前行行前插入一行或多行。
— d:删除,删除指定的行
— p:打印,输出指定的行。
— s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。

行数据操作

[root@localhost ~]# sed '2p' student.txt
#查看文件的第二行
[root@localhost ~]# sed -n '2p' student.txt
#查看文件的第二行,且只显示第二行
[root@localhost ~]# sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身
[root@localhost ~]# sed '2a piaoliang jiushi renxing' student.txt
#在第二行后追加
[root@localhost ~]# sed '2i meinv' student.txt
#在第二行前插入两行数据
[root@localhost ~]# sed '2c furong bu ji ge' student.txt
#数据替换

字符串替换
sed ‘s/旧字串/新字串/g’ 文件名

[root@localhost ~]# sed '3s/60/99/g' student.txt
#在第三行中,把60换成99

[root@localhost ~]# sed -i '3s/60/99/g' student.txt
#sed操作的数据直接写入文件

[root@localhost ~]# sed -e 's/fengj//g;s/cang//g' student.txt
#同时把"fengj"和"cang"替换为空

三、字符处理
1、排序命令sort
[root@localhost ~]# sort [选项] 文件名
选项:
— -f:忽略大小写
— -n:以数值型进行排序,默认使用字符串型排序
— -r:反向排序
— -t:指定分隔符,默认是分隔符是制表符
— -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

[root@localhost ~]# sort /etc/passwd
#排序用户信息文件

[root@localhost ~]# sort -r /etc/passwd
#反向排序

[root@localhost ~]# sort -t ":" -k 3,3 /etc/passwd
#指定分隔符是":",用第三字段开头,第三字段结尾排序,就是只用第三字段排序

[root@localhost ~]# sort -n -t ":" -k 3,3 /etc/passwd

2、统计命令wc
[root@localhost ~]# wc [选项] 文件名
选项:
— -l:只统计行数
— -w:只统计单词数
— -m:只统计字符数

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据