Linux网络服务与shell脚本——Shell编程之Sed、Awk与正则表达式
第十章 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
- 点赞
- 收藏
- 分享
- 文章举报
- shell脚本之正则表达式、函数、grep、sed、awk、printf等基本命令配置详解
- shell脚本之正则表达式、grep、sed、awk
- shell中的文本处理正则表达式(grep,sed,awk,linux中三剑客)
- Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
- Linux--shell脚本之正则表达式
- Linux--shell脚本之正则表达式
- 学习shell, 正则表达式, awk, sed
- linux 正则表达式 之 sed 与awk
- Linux下shell脚本编程之正则表达式
- Linux中正则表达式与文件格式化处理命令(awk/grep/sed)
- Linux---文本处理(正则表达式,grep,awk,sed)
- linux(5)--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
- Linux:vi编辑器,正则表达式,文本处理cut、sort、wc、sed、awk,用户权限
- Linux基本功十三:shell脚本Sed & Awk 及软件的安装
- Shell正则表达式之grep、sed、awk实操笔记
- Linux学习笔记---day8(3.27)sed,awk与正则表达式
- Linux网络服务与shell脚本——Linux防火墙(2)
- linux学习笔记-第十二课-Shell脚本之正则表达式(一)
- Linux网络服务与shell脚本——Linux防火墙(1)