shell 中文本处理三剑客(grep+sed+awk)

1.grep

Global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行。由正则表达式或者字符及基本文本字符所编写的过滤条件

(1)grep 的格式

grep	匹配条件	处理文件
grep	root	passwd		//搜索文件中含有root的行
grep	^root	passwd		//搜索文件中以root开头的行
grep	root$	passwd		//搜索文件中以root结尾的行
grep 	-i root	passwd		//-i:忽略大小写
grep 	-E "root|ROOT" 	passwd	//同时匹配多个条件

在这里插入图片描述
(2)grep 中的正则表达式

^westos		//输出以westos开头的行
westos$		//输出以westos结尾的行
'w...s'		//输出含有w与s之间只有3个字符的字符串的行
'w...'		//输出w之后至少有三个字符的行
'...s'		//输出s之前至少有三个字符的行

在这里插入图片描述

(3)grep 中字符的匹配次数设定

* 			字符出现 [0- 任意次 ]
\?			字符出现 [0-1 次 ]
\+	 		字符出现 [1- 任意次 ]
\{n\}		字符出现 [n 次 ]
|{m,n\} 	字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\}		字符出现 [0-n 次 ]
\{m,\}		字符出现 [ 至少 m 次 ]
\(xy\)\{n\}xy 	关键字出现 [n 次 ]
.*			关键字之间匹配任意字符

(4)grep 中字符的匹配位置设定

^关键字		//以关键字开头
关键字$		//以关键字结尾
"\<关键字"		//以关键字开头
"关键字\>"		//以关键字结尾
"\<关键字\>"		//精确匹配关键字

在这里插入图片描述

(5)grep 正则表达式与扩展正则表达式

正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”或”的扩展正则表达式元字符 , 正规的 grep 无法识别加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp和 grep -E 一样

2.sed

stream editor
用来操作纯 ASCII 码的文本
处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间” (patternspace) 可以指定仅仅处理哪些行
sed 符合模式条件的处理不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。

(1) Sed 命令格式

调用 sed 命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

(2) sed 对字符的处理

p显示
d删除
a添加
c替换
w写入
i插入

(3) p 模式操作

 sed -n '/#/p' fstab		//显示以#开头的内容
 sed -n '/UUID$/p' fstab	//显示以UUID结尾的内容
 sed -n '/^UUID/p' fstab	//显示以UUID开头的内容
 sed -n '2,6p' fstab		//显示第2行到第6行
 sed -n '2,6!p' fstab		//显示第2行到第6行以外的内容
 sed -n '2p;6p' fstab		//显示第2行和第6行的内容
 -n		//只显示处理后的内容,不显示原来的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4) d 模式操作

sed  '/^UUID/d' /etc/fstab	//删除以UUID开头的内容
sed  '/^#/d' /etc/fstab		//删除以#开头的内容
sed  '/^$/d'/etc/fstab		//删除空行
sed  '1,4d'/etc/fstab		//删除1到4行
sed  '/^UUID/!d' /etc/fstab //删除以UUID开头的行以外的行;即留下以UUID开头的行

在这里插入图片描述
在这里插入图片描述

(5) a 模式操作

sed '/^UUID/a \hello' /etc/fstab		//在UUID开头的行后添加一行,hello行
sed '/^UUID/a \hello\nwestos' /etc/fstab	//在UUID开头的行后添加两行,hello行与westos行
\n:		//换行

在这里插入图片描述
(6) i 模式操作

sed '/^UUID/i \hello\nwestos' /etc/fstab	//在UUID开头的行前添加两行,hello行与westos行

在这里插入图片描述
(7) c 模式操作

sed '/^UUID/c\hello sed\nwestos‘ /etc/fstab		//将UUID开头的行换成hello行和westos行(一行可以直接变成两行)

在这里插入图片描述

(8) w 模式操作

sed  '/^UUID/w /mnt/file' fstab  //把以UUID开头的行写入/mnt/file文件
sed  -n '/^UUID/w /mnt/filet' fstab

在这里插入图片描述
(9) sed 的其他用法

sed  -n  '/^UUID/=' fstab	//显示UUID所在的行号
sed  '6r file' file1		//将file1文件第6行之后的内容添加到file文件中
sed  -n -e ‘/^UUID/p' -e '/^ UUID/=' fstab	//显示UUID行,并显示行号
sed   -e 's/brown/green/; s/dog/cat/' data
sed  -f rulesfile file
sed  's/^\//#/'/etc/fstab
sed  's@^/@#@g'/etc/fstab
sed  's/\//#/'/etc/fstab
sed  's/\//#/g/'/etc/fstab
sed  'G' data				//两行之间添加空白行
sed  '$!G' data				//两行之间添加空白行
sed  '=' data | sed 'N; s/\n/ /'
sed  -n '$p' data

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.awk:报告生成器

处理机制:
awk 会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下 :

BEGIN{}读取文件之前执行,一般用来初始化操作
{}逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快
END{}处理完文件之后执行,一般用来输出处理结果
NR处理了几行,NR就等于几
NF根据分隔符,处理完某行后,NF等于该列的列数
" "(空格)默认分隔符
awk -F : '{print $1}' passwd		//打印passwd的第一列;-F指定分隔符
awk -F : 'BEGIN{print "AAAAAA"}{print $1}END{print "BBBBBB"}' passwd
awk -F : 'BEGIN{N=0}{N++;print $1,N}END{print N}' passwd	//,---一条命令
awk -F : 'BEGIN{N=1}{print N++,$1}END{print N}' passwd
awk -F : 'BEGIN{N=0}{print $1;N++}END{print N}' passwd	//;--两条命令

在这里插入图片描述

awk 'END{print NR}' passwd		//统计行数
awk -F : 'END{print NF}' passwd	//统计最后一行列数
awk 'NR==3{print}' passwd		//打印第三行
awk -F : 'NR==3{print $1}' passwd	//打印第三行第一列
awk -F : 'BEGIN{n=1}n==2{print $1}n++' passwd
	n==2{print $1}	//条件+{}:条件成立执行括号里面的内容
	n++		//只有条件 = 条件+{print}:除条件不成立或为零之外执行括号里面的内容
awk 'END{print FILENAME}' passwd	//打印文件名

在这里插入图片描述

awk '/^root/{print}' passwd		//以root开头的行
awk '/bash$/{print}' passwd		//以bash结尾的行
awk '/^root|nologin$/{print}' passwd	//以root开头或以nologin结尾的行
awk '/^root/&&/bash$/{print}' passwd	//以root开头并且以bash结尾的行
awk '/^[root|lp]/' passwd		//以root或lp开头的行
awk '/^root|^lp/{print}' passwd		//以root或lp开头的行
awk '/^[a-d]/' passwd			//以a或b或c或d开头的行 
awk '/^a|^b|^c|^d/' passwd		//以a或b或c或d开头的行
awk -F : '$6~/^\/sbin/{print }' passwd	//以:为分隔符,第6列以/sbin开头的行
awk -F : '$6!~/^\/sbin/{print }' passwd	//以:为分隔符,第6列不以/sbin开头的行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值