一.什么是正则表达式
- 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
二.shell编程之正则表达式与通配符
1.通配符
*
匹配任意内容?
匹配任意一个内容[]
匹配中括号中的一个字符
2.正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来匹配了。
三.Shell编程之基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首。例如:^hello会匹配以hello开头的行 |
$ | 匹配行尾。例如:hello$会匹配以hello结尾的行 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符 |
[^] | 匹配除中括号的字符意外的任意一个字符 |
\ | 转义符,用于取消特殊符号的含义 |
\{n\} | 表示其前面的字符恰好出现n次 |
\{n,\} | 表示其前面的字符出现不小于n次 |
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次 |
- 只要是按规则包含的行就会匹配(包含匹配,与java等其他语言匹配不太相同)
四.字符截取命令
1.cut字段提取命令[列提取]
-
[root@localhost ~]# cut [选项] 文件名
-f 列号
:提取第几列-d 分隔符
:按照指定分隔符分割列
-
如想获得
/etc/passwd
下获得指定用户名user1和user2-
源文件中的内容
user1:x:1001:1001::/home/user1: user2:x:1002:1002::/home/user2:
-
截取命令
grep "user[0-9]" /etc/passwd | cut -f 1 -d ":"
-
结果
user1 user2
-
-
cut默认
\t
为其分隔符,故使用cut截取df -h
无效
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键
-
使用实例
printf '%s/t%s/t%s/n' 1 2 3 4 5 6 #输出结果 #1 2 3 #4 5 6
-
-
在awk命令的输出中支持print和printf命令
- print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
- printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
3.awk命令
-
awk '条件1{动作1}条件2{动作2}...‘ 文件名
-
条件(Pattern)
- 一般使用关系表达式作为条件
x>10
判断变量x是否大于10x>=10
大于等于x<=10
小于等于
-
动作(Action)
- 格式化输出
- 流程控制语句
-
实例
awk '{printf $2 "\t" $4 "\n"}' student.txt#$2表示第二列,$4第四列,awk是一行一行读处理的,输出格式需要用双引号标识 df -h | awk '{print $5}'#截取第五列 awk 'BEGIN{print "This is beginning"}{print $2 "\t" $4}' student.txt #BEGIN作用,在所有数据处理之前执行 #打印结果 #This is beginning #Name Mark #furong 85 #fengj 60 #cang 70 cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"}{print $1 "\t" $3}' #结果(因为最起初会加载第一行,FS表示以指定符号分割) #root:x:0:0:root:/root:/bin/bash #user1 500 #user2 501 cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{print $1 "\t" $3}' #结果 #root 0 #user1 500 #user2 501
-
4.sed命令
-
sed [选项] '[动作]' 文件名
-
选项
-n
:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕-e
:允许对输入数据应用多条sed命令编辑(在动作中用分号分隔)-i
:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
-
动作
a
:追加,在当前行后添加一行或多行c
:行替换,用c后面的字符串替换原始数据行i
:插入,在当前行前插入一行或多行。d
:删除,删除指定的行p
:打印,输出指定的行s
:字串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字串/新字串/g“(和vim中的替换格式类似)【没加行范围则是全局替换】
-
实例代码
sed '2p' student.txt #ID Name gender Mark #1 furong F 85 #1 furong F 85 #2 fengj F 60 #3 cang F 70 sed -n '2p' student.txt#一般加p的动作,都适用-n选项 #1 furong F 85 sed '2,4d' student.txt #ID Name gender Mark 删除第二行到第四行,只剩第一行了 sed '2a 1-1 Jack G 90' student.txt#在指定行之后添加 #ID Name gender Mark #1 furong F 85 #1-1 Jack G 90 #2 fengj F 60 #3 cang F 70
-
五.字符处理命令
1.排序命令sort
-
sort [选项] 文件名
-
选项
-f
:忽略大小写-n
:以数值型进行排序,默认使用字符串型排序-r
:反向排序-t
:指定分隔符,默认分隔符是制表符-k n[,m]
:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
-
实例代码
sort -n -t ":" -k "3,3" /etc/passwd#以数值型为基准,:为分隔符,按照第三列排序/etc/passwd文件
-
2.统计命令wc
-
wc [选项] 文件名
-
选项
-l
:只统计行数-w
:只统计单词数-m
:只统计字符数
-
实例代码
wc /etc/passwd#获得指定文件的行数,单词数和字符数
-