shell的正则表达式
一.grep
1.grep:文本过滤命令:是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行 ;
由正则表达式或者字符及基本文本字符所编写的过滤条件 。
grep格式
参数
grep root passwd 模糊匹配(贪婪模式只要有)
grep ^root passwd 以root开头的行
grep root$ passwd 以root结尾的行
grep -i root passwd 忽略大小写
grep -E root passwd -E扩展正则表达式
示例:
grep root passwd 匹配root字符
grep -E "root\>" passwd
grep -E "\<root\>" passwd 匹配以root开头以root结尾的字符段
grep -E "^\<root\>" passwd 匹配以root开有的行
grep -E "\<root\>$" passwd 匹配以root结尾的行
grep -E -i "\<root\>" passwd -i表示忽略大小写
示例:
3.匹配字符出现次数
grep中的正则表达式
grep -E "x.." westos 匹配x后面两位的
grep -E "x..\>" westos 匹配x后面两位的,从后往前匹配
grep -E "\<x..\>" westos 匹配x后面仅有两位的,前面没有后面也没有
grep中字符的匹配次数设定
* 字符出现0-任意次
\? 字符出现0-1次
\{n\} 字符出现n次
示例:
grep -E "x*y" file 匹配x出现任意次
grep -E "x?y" file 匹配x出现0-1次
grep -E "\<x?y" file 匹配x最少出现0-1次
grep -E "\<x{2}y" file 匹配x出现2次
grep -E "\<x{,2}y" file 匹配x出现0-2次
grep -E "\<x{2,}y" file 匹配x出现2-任意次
grep -E "\<x+y" file 匹配x最少出现一次
grep -E "(xy)+" file 匹配xy最少出现一次
grep -E "(xy)+\>" file 匹配xy最少出现一次,从后往前匹配
脚本示例:
编辑脚本:vim ip_show.sh 显示主机ip
内容:
#!/bin/bash
`ifconfig eth0 > /mnt/ip_file`
grep -E "inet\ " /mnt/ip_file | cut -d " " -f 10
执行结果:
二.sed 行编辑器
1. sed:用来操作纯 ASCII 码的文本
sed处理原理:处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行,sed 符合模式条件的处理不符合条件的不予处理处理完成之后把缓冲区的内容送往屏幕接着处理下一行 , 这样不断重复 , 直到文件末尾 。
2. Sed 处理模式
sed 对字符的处理的模式:
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
(1).p模式操作:显示
sed -n '/#/p' 显示有#号的行
sed -n '/UUID/p' 显示有UUID的行
sed -n '/^UUID/p' 显示以UUID开头的行
sed -n '/UUID$/p' 显示以UUID结尾的行
sed -n '2,5p' 显示2-5行
sed -n '2,5!p' 显示除了2-5行的行
cat -n fstab | sed -ne '3p;5p;6p' 显示3.5.6行
示例:
(2).d模式操作: 删除
sed '/UUID/d' 删掉UUID的行
sed '/^UUID/d' 删掉以UUID开头的行
sed '/UUID$/d' 删掉以UUID结尾的行
sed '1,4d' fstab 删掉1-4行
示例:
(3).a模式操作:添加
sed '/UUID$/a hello\n www' 在以UUID结尾的行后面添加
示例:
(4).i模式操作:保存到原文件
sed '/UUID$/s/jdkldmc=UUID/dkldmc=UUIDhello/' -i fstab
替换(s表示替换,-i表示写入原文件)
示例:
(5).w模式操作:写入
sed '/^UUID/w www' fstab
sed -n '/^UUID/w www' fstab 把fstab文件中UUID开头的行写入到www文件中
sed '/^UUID/=' fstab 显示UUID的行的行号
sed '1r hello' fstab 把hello文件的第一行写入到fstab文件的第一行
sed '$r hello' fstab 把hello文件的最后一行写入到fstab文件的最后一行
示例:
(6).c模式:替换
sed '/^UUID/c hello' fstab 将以UUID开有的行替换成hello
示例:
(7).sed其他用法
sed -n '/^UUID/=' fstab 显示fstab文件的UUID行号
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab
把fstab文件的UUID行打印出来并显示行号
sed 'G' fstab 给每行后面加行空格
sed '$!G' fstab 给每行后面加行空格,除了最后以行
sed '=' fstab | sed 'N;s/\n/ /' 给每一行前面加入行号
sed -n '$p' fstab 显示最后一行
示例:
脚本示例:
编辑脚本:vim changehttp_port.sh 更改httpd服务的端口
内容:
#!/bin/bash
[ -z "$1" ] && {
echo Error:plrese give me a num for http port!
exit 1
}
sed "/^Listen/c Listen\ $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
执行脚本结果:
三.awk 报告生成器
1.awk处理机制: awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
2. awk 基本用法
awk -F : 'BEGIN{print "NAME"}' passwd 动作执行前打印NAME
awk -F : 'BEGIN{print "NAME"}{print $1}' passwd 打印第一列
awk -F : '/bash$/{print $1}' passwd 打印以bash结尾的第一列
-F 表示以什么为分隔符
awk -F : 'NR==3' passwd 以:为分隔符打印第三行
awk -F : 'BEGIN{print "NAME"}NR<=3&&NR>=2{print $1}' passwd
以:为分隔符,处理前打印NAME,打印2-3行的第一个字符
示例:
打印能登陆系统,且家目录时/home的用户个数:
awk -F : '$6~/^\/home/&&/bash$/{print $1}' /etc/passwd
以:为分隔符第六列以/home开头并且以/bash结尾的字符
awk -F : 'BEGIN{N=0}$6~/^\/home/&&/bash$/{N++}END{print N}' /etc/passwd
开始N=0,找到一个加一个,最后打印出总个数
打印设备eth0网卡的IP:
awk -F = '/IPADDR/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
ifconfig eth0 | awk -F " " '/inet\ /{print $2}'