您的位置:首页 > 理论基础 > 计算机网络

Linux网络服务与shell脚本——Shell编程之Sed、Awk与正则表达式

2020-01-15 02:23 555 查看

                           第十章 Shell编程之Sed与Awk

一、正则表达式概述
1、基础正则表达式
(1)基础正则表达式是常用的正则表达式部分

2、扩展正则表达式
(1)扩展正则表达式是对基础正则表达式的扩充

二、Sed工具概述
1、Sed基本语法:sed -选项 '编辑命令’ 文件1……文件2
(1)选项

(2)常用操作

(3)替换标志

2、Sed用法示例
(1)输出指定行

[code]sed -n 'p’ /etc/passwd            #输出所有内容
sed -n '6p’ /etc/passwd            #输出第6行内容
sed -n '6,8p’ /etc/passwd        #输出6-8行内容
sed -n 'p;n’ /etc/passwd            #输出奇数行内容
sed -n 'n;p’ /etc/passwd            #输出偶数行内容
sed -n '1,10{p;n}’ /etc/passwd    #输出1-10行的奇数行内容
sed -n '1,10{n;p}’ /etc/passwd    #输出1-10行的偶数行内容
sed -n '10,${n;p}’ /etc/passwd    #输出第10行到末尾行的偶数行
sed -n '$p’ /etc/passwd            #输出最后一行
sed -n '1,+4p’ /etc/passwd        #从第1行开始,连续输出4行(1-5行)
sed -n '/root/p’ /etc/passwd        #匹配包含root的行
sed -n '10,/nom/p’ /etc/passwd    #输出从10行到第一个匹配到nom的行
sed -nr '/ro{1,}t/p’ /etc/passwd    #-r支持拓展正则表达式,输出匹配ro{1,}t的行
sed -n '/root\|ntp/p’ /etc/passwd    #输出包含root或ntp的行(遇特殊符号,正则表达式需加转义符\)
sed -n '/nom/=’ /etc/passwd        #输出包含nom的行,=表示输出行号
sed -e '5q' /etc/passwd            #输出前5行内容后退出

(2)插入符合条件的行

[code]sed '/root/i admin:x:490:490:' /etc/passwd    #在含有root的行前插入admin……
sed '/root/a admin:x:490:490:' /etc/passwd    #在含有root的行后插入admin……
sed '3aADMIN' /etc/passwd                #在第3行后插入ADMIN

(3)删除符合要求的行

[code]sed '1d' /etc/passwd            #删除第1行
sed '$d' /etc/passwd            #删除最后一行
sed '^$' /etc/passwd            #删除所有空行
sed '2,4d' /etc/passwd            #删除2-4行
sed '/root/d' /etc/passwd        #删除所有root行
sed '/root/!d' /etc/passwd        #删除所有不包含root的行
sed '/^root/d' /etc/passwd        #删除root开头的行
sed '/root$/d' /etc/passwd        #删除root结尾的行

(4)替换符合要求的文本

[code]sed 's/root//g' /etc/passwd                #将所有root删除(替换root字符串为空)
sed '/root/c admin' /etc/passwd            #将含有root的行替换为admin
sed 's/root/admin/2p' /etc/passwd        #将每行第2个root替换为admin
sed '/root/s/root/ROOT/g' /etc/passwd        #将包含root的所有行中的root替换为ROOT
sed '1,3s/bin/BIN/g' /etc/passwd            #将1-3行所有bin替换为BIN
sed 's/$/ABC/' /etc/passwd                #每行行尾插入ABC
sed 's/^/#/' /etc/passwd                    #每行行首插入#
sed '/root/s/^/#/' /etc/passwd            #将包含root的行首加入#
sed '1cABC' /etc/passwd                    #将第一行替换为ABC
sed 'y/root/ROOT/' /etc/passwd            #将root替换为ROOT,y表示对应替换

(5)迁移符合条件的文本

[code]sed '/root/w file1' /etc/passwd        #将包含root的行另存为文件file1
sed '/root/{H;d};$G' /etc/passwd        #将包含root的行迁移至末尾
sed '1,5{H;d};$G' /etc/passwd        #将1-5行迁移至末尾
sed '/root/{H;d};$G' /etc/passwd        #将包含root的行迁移至末尾

(6)执行多次命令

[code]sed -ne 's/root/admin/' -ne 's/bash/sh/p' /etc/passwd        #将root和bash行做替换

PS:可将多个编辑命令保存到文件中,通过-f指定文件来完成多个操作
(7)直接修改文件内容
使用-i可直接修改文件
3、Sed脚本应用案例

[code]#!/bin/bash
#设置变量,指定配置文件路径
CONFIG='/etc/vsftpd/vsftpd.conf'
#备份配置文件
[ -e "$CONFIG.old" ] || cp $CONFIG $CONFIG.old
#修改配置文件,实现进制匿名用户登录
sed -i '/^anonymous_enable/s/YES/NO/g' $CONFIG
#允许本地用户登录,且具有写入权限
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
#监听端口
sed -i '/^listen/s/NO/YES/g' $CONFIG

三、Awk工具介绍
1、Awk基本语法
(1)格式
awk 【选项】 ‘模式或条件{编辑指令}’ 文件1 文件2
awk -f 脚本文件 文件1 文件2
(2)选项
-F fs:指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=var:赋值一个用户定义变量var=var。
-f file:从脚本文件中读取awk命令。
(3)内置变量

2、Awk用法示例
(1)打印文本内容

[code]awk '/^root/{print}' /etc/passwd                #输出root开头的行
awk '/nologin$/{print}' /etc/passwd            #输出nologin结尾的行
awk -F '/bash$/{print|"wc -l"}' /etc/passwd        #统计系统用户个数,使用管道调用wc命令统计行数
AWK可使用运算符、逻辑操作符、并可以进行简单数学运算
awk 'NR==1,NR==3{print}' /etc/passwd            #输出1-3行
awk 'NR==1||NR==3{print}' /etc/passwd        #输出1、3行
awk '(NR>=1)&&(NR<=3){print}' /etc/passwd    #满足条件时输出相应行(1-3)
awk '(NR%2)==1{print}' /etc/passwd            #输出奇数行
awk '(NR%2)==0{print}' /etc/passwd            #输出偶数行
awk -F:  '!($3<900){print}' /etc/passwd        #输出第三列不小于900的行
awk -F: '{if($3>200){print}}' /etc/passwd        #输出第三字段大于200的行
awk -F: '{max=($3>$4)?$3:$4;print max}' /etc/passwd        #当满足$3>$4,则把:前的值给max,否则把:后的值给max

(2)按字段输出文本

[code]awk -F: '{print NR,$0}' /etc/passwd                #输出处理数据的行号,行内容
awk -F ":" '$3<5{print $1,$3}' /etc/passwd            #输出第三列小于5的1/3列
awk -F: '($1~"root")&&(NF==7){print $1,$3}' /etc/passwd    #输出包含7个字段且第一字段包含root的行的1/3两个字段
awk -F: 'NR==3,NR==7{print $1,$7}' /etc/passwd        #输出3-7行的1/7列数据
awk -F: 'NR==3,NR==7{print "USERNAME:" $1,"SHELL:" $7}' /etc/passwd    #输出时加入文本标签
awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd        #设置以:为分隔符并打印1/3列

‘BEGIN{};END{}’:表示先执行BEGIN,再执行END
(3)可用“|”处理命令输出结果
3、Awk应用案例

[code]#!/bin/bash
#monitor availabe disk space
#截取df输出,获取剩余使用百分比的值
SPACE='df | sed -ne '/\/$/p' | awk '{print $5}' | sed 's/%//''
#截取值大于90时发送报警邮件
if [ $SPACE -ge 90 ]
then
echo "disk spaceis not enough" | mail -s “alarm” root
fi

四、Shell编程实战

五、练习题。
1、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空字符的行
sed -n '/^#[:spease:]/{1/}[^[:spease:]]*/p' /etc/fstab

2、查找/etc/inittab中含有“以#开头,以t结尾的单词的行”
sed -n '/#[a-z]*t/p' /etc/inittab

3、显示UID为3位数以上的行,并显示行号
awk -F: '($3>99){print NR,$0}' /etc/passwd

4、找出/etc/passwd中的所有大写字母,并显示颜色
grep -o [A-Z] /etc/passwd

5、过滤/etc/inittab中的有效字符行(过滤空行及#开头行)
grep -v -e "^$" -e "^#" /etc/inittab

6、在/etc/passwd中查找连续的两个 o 字符的行
grep oo /etc/passwd

7、将 regular_express.txt 的内容列出并打印行号,同时,将 2-50 行删除显示:
awk '(NR<2)||(NR>50){print NR,"---"$0}' messages

8、用sed打印/etc/passwd的2-5行,并显示行号
sed -n "2,5{=;p}" /etc/passwd | sed ":a;N;s/\n//g;n;ba"

9、用sed打印/etc/passwd的奇数行,并显示行号
sed -n "{=;p;n}" /etc/passwd | sed ":a;N;s/\n//g;n;ba"

10、/etc/passwd文本中”bash“全局替换成’nologin‘,并纸打印替换的那一行,注意这里不能省略最后的”p“命令
sed -n 's/\/bin\/bash/\/sbin\/nologin/p' /etc/passwd

  • 点赞
  • 收藏
  • 分享
  • 文章举报
元芳很忙 发布了36 篇原创文章 · 获赞 13 · 访问量 2637 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: