shell编程正则表达式之sed,awk

shell编程之sed,awk

前言:
Sed是文本处理工具,可以读取文本内容,根据指定条件对数据进行添加,删除,替换等操作。Awk十一功能强大的编辑工具
正则表达式概述
正则表达式是组成操作sed和awk的基本语法
正则表达式分为:基础正则表达式和扩展正则表达式。它不是一个工具程序,而是一个字符串处理的标准依据,有普通字符(a~z)组成,以及特殊字符(也称元字符)组成。
支持正则表达式的工具:
Vi编辑器,grep,egrep,sed,awk
基础正则表达式
基础正则表达式元字符

元字符	作用
\		转义字符,用于取消特殊符号的含义
^		匹配字符串的开始位置
$		匹配字符串的结束位置
.		如‘r..d’匹配r和d之间有两个字符的行
*		匹配前面的子表达式出现了0次或则多次
[list]	匹配[list]列表中的任意一个字符
[^list]	不匹配[list]列表中的一个字符
\{n\}	匹配前面的子表达式出现了n次的行  如:0{2\}
\{n,\}	匹配前面的子表达式不少于n次的行  如:0\{3,\}
-v		匹配不包含字符串的行
-e		查找多个模式

下面以grep工具为例,介绍正则表达式

grep root /etc/passwd			//筛选文件包含root的行
grep ^root /etc/passwd			//筛选出以root开头的行
grep bash$ /etc/passwd			//筛选出以bash结尾的行
grep -v root /etc/passwd		//筛选出不包含root的行
grep 'r..d' /etc/passwd			//筛选出r和d间有两个字符的行
grep [^s]bin /etc/passwd		//筛选出bin前面不是s的行
grep t[sd] /etc/passwd			//筛选出包含字符ts或td的行
grep '0\{3,\}' /etc/passwd 		//筛选出0出现3次及以上的行
grep -e ntp -e root /etc/passwd//-e 筛选多个查找内容
grep [0-3] /etc/passwd			//筛选出包含0-3的行
grep [^a-z]ae /etc/passwd		//筛选ae前面不是小写字母的行
grep ^[a-z]ae /etc/passwd		//筛选出ae前面是小写字母的行

扩展正则表达式

元字符	作用
+	匹配前面的子表达式1次以上
?	匹配前面的子表达式0或则1 如:go?d  将匹配go或god
()	将()号中的一个字符作为一个整体
|	以或的方式匹配字符串

Sed工具概述
sed是文本处理工具,依赖于正则表达式,可以读取文本内容,根据指定条件对数据进行添加,删除,替换等操作。
Sed在处理数据时默认不直接修改源文件,而是处理的缓冲区,处理完成后把缓冲区内容默认输出到屏幕。文件本身内容没有改变

Sed基本语法
格式:
sed 【选项】【编辑指令】【文件】
选项:
-e:指定要执行的命令,只有一个编辑命令可以省略
-n:只输出处理后的行
-i:直接编辑文件内容,而不输出结果

编辑指令格式:
【地址1】【地址2】操作【参数】
sed文件也可以使用正则表达式各种元字符,这里地址指正则表达式,如果没有地址就代表所有行。

常用操作
指令	作用
p	输出指定的行
d	删除指定的行
s	字串替换,格式:“行范围s/旧字符串/新字符串/g”
i	插入,在当前行前面插入一行或多行
w	保存为文件
r	读取指定文件
n	延续到下一行

sed用法示例
(1)输出指定行

sed -n 'p' passwd				//将所有内容输出
sed -n '6p' passwd 				//将第6行内容输出
sed -n '6,8p' passwd				//将第6~8行内容输出
sed -n 'p;n' passwd				//将所有奇数行输出
sed -n 'n;p' passwd				//将所有偶数行输出
sed -n '1,10{p;n}' passwd		//将1~10行的奇数行输出,可省略{}
sed -n '1,10{n;p}' passwd		//将1~10行的偶数行输出,可省略{}
sed -n '$p' passwd				//将最后一行输出
sed -n '1,+4p' passwd			//将第1行开始,再+4行输出
sed -n '/root/p' passwd			//将包含有root的内容输出
sed -n '/root\|ntp/p' passwd	//将包含root或ntp内容的行输出
sed -n '/mon/=' passwd			//将包含mon的行号输出 “=表示行号”
注意:遇到特殊符号,需使用转义符“\”

(2)插入符合条件的行

sed '/root/i 520' passwd 		//i	 在包含root行的前一行插入520
sed '/root/a 520' passwd		//a	 在包含root行的后一行插入520
sed '3a 520' passwd				//在第三行之后插入520

(3)删除符合要求的行

sed '1d' passwd					//删除第1行
sed '$d' passwd					//删除最后1行
sed '^d' passwd					//删除所有空行
sed '2,4d' passwd				//删除第2~4行
sed '/root/d' passwd				//删除包含root的行
sed '/root/!d' passwd			//删除不包含root的行, !表反向
sed '/^root/d' passwd			//删除以root开始的行
sed '/root$/d' passwd			//删除以root结尾的行

(4)替换符合条件的文本

sed 's/root//g' passwd			//将文件所有root字符删除
sed 's/root/520/g' passwd		//将文件所有root字符替换成520
sed -n 's/root/520/g2p' passwd	//将root行中第2个root替换成520
sed '1,3s/root/520/g' passwd	//将1~3行中的root替换成520
sed '/root/c 520' passwd		//将包含root行的内容替换成520
sed 's/$/ABC/g' passwd			//在每行行尾插入字符ABC
sed 's/^/#/g' passwd				//在每行行首插入字符#		

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

sed '/root/w file' passwd		//将包含root行另存为文件file
sed '/root/{H;d};$G' passwd		//将包含root行迁移至行尾
sed '1,5{H;d};$G' passwd		//将1~5行内容迁移至行尾
注:其中H表示保存当前模式到一个缓冲区,G表示取出保存模式

(6)执行多次命令
sed -ne ‘s/root/520/g’ -ne ‘s/bash/250/g p’ passwd
(7)直接修改文件内容
sed -i ‘s/^/#/g’ passwd //在每行开头插入#号
sed -i ‘s/^#//g’ passwd //将每行开头的#号删除

awk工具概述

Awk是一个功能强大的编辑工具,常作为脚本使用。Awk逐行读取文件文本,默认以空格为分隔符进行分隔,将分隔所得的个字段保存到内建变量中,对比该行是否与给定的模式相匹配,并按模式或条件执行编辑命令。
awk基本语法:(两种)
awk【选项】’模式或条件{编辑命令}’文件1 文件2 //常用
awk -f 脚本文件 文件1 文件2
模式:分为条件语句复合语句或正则表达式等。编辑指令可包含多条语句;分开
选项:
-F:指定字段分隔符,默认空格为分隔符
-v:自定义变量
-f:从脚本中读取awk命令

awk处理文本常用的内置变量
变量	描述
FS	指定每行文本的字段分隔符,默认为空格或制表位
NF	当前处理的行的字段个数
NR==	当前处理的行的行号(序数)
$0	当前处理的行的整行内容(所有)
$n	当前处理行的第n个字段(第n列)

awk用法示例
(1)打印文本内容

awk '/^root/{print}' passwd			//输出以root开头的行
awk '/root$/{print}' passwd			//输出以root结尾的行
awk 'NR==1,NR==3{print}' passwd	//输出第1行至第3行
awk '(NR>=1)&&(NR<=3)' passwd 		//输出第1行至第3行
awk 'NR==1||NR==3{print}' passwd	//输出第1行和第3行
awk '(NR%2)==1{print}' passwd		//输出所有奇数行的内容
awk '(NR%2)==0{print}' passwd		//输出所有偶数行的内容
注:
使用awk过程中可以使用关系运算符作为“条件”,用于比较数字与字符串。如:(>),(<),(=),(>=),(<=),(==),(!+=),&&,||,!,(+),(-),(*),(%)

(2)按字段输出文本

awk -F: '{print NR,$0}' passwd		//输出处理数据的行数
awk -F: '{print $1,$3}' passwd		//输出每行第1个和第3个字段(列
awk -F: 'NR==3,NR==7{print $1 $3}' passwd	//输出3~7行第3,第4字段
awk -F: '$7~"/bash"{print $1}' passwd//输出7字段包含bash的第1个字段
awk -F: '{print $1":"$2":"$3":"$4}' passwd   //保留原格式输出1234字段,双引号内容直接输出
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值