AI智能
改变未来

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行的前一行插入520sed \'/root/a 520\' passwd		//a	 在包含root行的后一行插入520sed \'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字符替换成520sed -n \'s/root/520/g2p\' passwd	//将root行中第2个root替换成520sed \'1,3s/root/520/g\' passwd	//将1~3行中的root替换成520sed \'/root/c 520\' passwd		//将包含root行的内容替换成520sed \'s/$/ABC/g\' passwd			//在每行行尾插入字符ABCsed \'s/^/#/g\' passwd				//在每行行首插入字符#

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

sed \'/root/w file\' passwd		//将包含root行另存为文件filesed \'/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字段,双引号内容直接输出
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » shell编程正则表达式之sed,awk