Bash之正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash之正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式,又叫规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式分为基本正则表达式和扩展正则表达式,扩展正则表达式添加了一些更加丰富的匹配规则而成。
1 grep:文本查找、过滤工具。根据模式搜索文本,并将符合模式的文本显示出来。
格式:grep [选项] [模式] file
选项:-i 忽略大小写
-v 显示未被模式匹配的行
-n 显示行号
-r 递归查找
--color 用颜色显示
查找包含root的行:
[[email protected] log]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
查找包含至少一个r的行(*:匹配其前字符任意次)
[[email protected] log]# grep --color "rr*" /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
查找包含oot或ost的行([]:匹配范围内任意单个字符)
[[email protected] ~]# grep --color o[os]t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
查找包含数字0-9的行
[[email protected] ~]# grep --color [0-9] /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
查找以root开始的行
[[email protected] ~]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
查找以nologin结尾的行
[[email protected] ~]# grep "nologin$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
过滤空白行
[[email protected] ~]# grep ^$ backpasswd
查看当前目录下包含root的行
[[email protected] ~]# grep -r root ./
./anaconda-ks.cfg:rootpw --iscrypted $6$K8rYflMst4cLGPIp$Dt8SHV9uPN/w4N3tQPAvyPFYjCCM5RHRRBcJf7NOP7MmqVFG1n0UYrfbgs7mDQ8KvobzHpC8R0Q3U.QUII38o.
./backpasswd:root:x:0:0:root:/root:/bin/bash
./backpasswd:operator:x:11:0:operator:/root:/sbin/nologin
./install.log:Installing rootfiles-8.1-6.1.el6.noarch
./install.log:Installing fakeroot-libs-1.12.2-22.2.el6.i686
./install.log:Installing fakeroot-1.12.2-22.2.el6.i686
查找出现数字2或5的行:
[[email protected] ~]# egrep "(2|5)" c.txt
2
553
2 sed:行编辑器,逐行处理文本文件,主要用于过滤和替换操作,适合处理大数据文件,sed默认并不直接修改源文件。
格式:sed [选项] [模式] file 其中模式如果是正则表达式,表示方式为:/正则表达式/
选项:--help 显示帮助
-n 只显示匹配的行
-e 允许执行多个操作
-i 修改原文件
-f 指定文件
-r 使用扩展正则表达式
模式: d 删除
p 打印
s 替换,如s/a/b/g,把a替换成b,g代表全局替换
w file 把模式空间的内容保存到文件中
a\ 在当前行后面加入文本
i\ 在当前行前面加入文本
r file 把文件内容添加到符合条件处
[[email protected] ~]# sed -n ‘1,2p‘ /etc/passwd #只打印前2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[[email protected] ~]# sed -e ‘1,3p‘ -e ‘5d‘ c.txt #执行多个操作
[[email protected] ~]# sed -i ‘s/5/66/g‘ c.txt #直接修改源文件
[[email protected] ~]# sed ‘1,3d‘ c.txt #删除前3行
[[email protected] ~]# sed ‘1,3w /root/a.txt‘ c.txt #把1至3行保存到a.txt文件中
[[email protected] ~]# sed ‘2a\ccc‘ c.txt #在第2行后面添加ccc
[[email protected] ~]# sed ‘2i\ccc‘ c.txt #在第2行前面添加ccc
[[email protected] ~]# sed ‘/3$/a\abcdefg‘ c.txt #//表示正则匹配
[[email protected] ~]# vim d.sh #创建一个sed脚本
/^3/d
[[email protected] ~]# sed -f d.sh c.txt #以3开始的行被删除
66
66
66
660000
[[email protected] ~]# sed ‘2q‘ c.txt #显示前2行后退出
66
66
3 awk:是一种编程语言,也是优秀的报告生成器,按某种格式显示,是强大的数据处理引擎。
格式:awk [选项] ‘模式 {动作}‘ file... 其中模式如果是正则表达式,表示方式为:/正则表达式/
选项:-F 指定分隔符
-v value=a 在执行处理过程之前,设置一个变量
-f 从脚本文件中读取指令
内置变量:
NF 当前记录的字段个数
OFS 输出字段分隔符,默认空格
NR 输入流的当前记录编号
FS 字段分隔符,需要在BEGIN处定义
表达式和操作符
a=1 自定义变量
+ 加
- 减
> 大于
< 小于
&& 与
|| 或
== 等于
!= 不等于
~ 匹配
!~ 不匹配
......
[[email protected] ~]# awk ‘/!ok/‘ a.txt #没有指定动作,默认为打印
[[email protected] ~]# vim a.sh #编辑awk脚本
/^$/ {print "abc"} #通过正则匹配空白行,并打印abc
[[email protected] ~]# awk -f a.sh a.txt
abc
abc
[[email protected] ~]# awk -F : ‘{print $2,$3}‘ /etc/passwd #指定分隔符,打印2,3字段
x 0
x 1
x 2
[[email protected] ~]# echo a b c | awk ‘{print $NF}‘ #打印输出行最后一个字段
c
[[email protected] ~]# echo a b c | awk ‘{print NF}‘ #显示输出行字段的个数
3
[[email protected] ~]# echo a b c | awk ‘BEGIN{OFS="-"}{print $1,$2,$3}‘ #输出分隔符
a-b-c
[[email protected] ~]# echo "cc" | awk ‘a=3 {print a+1}‘ #自定义变量和计算
4
[[email protected] ~]# awk -F : ‘$1~/root/ {print $3}‘ /etc/passwd #打印rootID号
0
[[email protected] ~]# awk -F : ‘$3>500 {print $1}‘ /etc/passwd #打印>500的ID号
nfsnobody
abc
[[email protected] ~]# df -h | grep "boot" | awk ‘{if($4<200) print "no" ;else print "ok"}‘
no
#条件表达式,判断boot分区的空间,注意格式
本文出自 “一万年太久,只争朝夕” 博客,请务必保留此出处http://zengwj1949.blog.51cto.com/10747365/1917519
以上是关于Bash之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章