shell编程-文本文件处理(grep sed awk文本三剑客)

一、grep和正则表达式
1、正则表达式
以一串字符作为表达式向系统传达意思(过滤匹配数据),元字符是描述字符的字符,正则表达式是有一串字符和元字符构成的字符串,主要功能为文本查询和字符串操作,匹配文本
大部分linux只支持基本的正则表达式。

hel*o helo hello hellllo		#*前面的l可以为0次或多次匹配
...76..							#.表示可以是任意字符
^cloud							#匹配以cloud为首的行
micky$							#匹配以micky结尾的所有行
^$								#匹配空行
[0-9]/[0123456789]				#穷举或范围表示
[^0-2]							#不再0-2范围的数字
\.								#转义特殊符号变普通字符
\<the\>							#精确匹配the
\{n\}							#匹配前面的字符出现n次
\{n,\}							#匹配前面的字符至少出现n次
\{n,m\}							#匹配前面的字符出现n-m次

2、grep命令
全面搜索正则表达式并显示出来,文本搜索工具,根据用户指定的“模式”进行匹配检查

模式:由正则表达式或者字符以及基本文字字符编辑的过滤条件

grep -n root /etc/passwd		#查找带行号的root
grep -v root /etc/passwd		#没有root的行
grep -vc root /etc/passwd		#总行数

在这里插入图片描述
在这里插入图片描述
二、sed编辑器
sed 行编辑器,在线编辑器
vim 交互式编辑器
速度快
一次处理一行内容,当前处理行存储在临时缓冲区,用sed编辑命令处理缓冲区中的内容。处理完成后将缓冲区的内容送往屏幕,直到文件末尾。

echo "this is a test" | sed 's/test/testing/'	#将test转换testing
sed 's/dog/cat/' file1							#改变文档中的字符,原文档保存
sed -e 's/dog/cat/;s/brown/green/' file1		#同时改两个
sed -f script file1								#将1命令用于2

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

2、标记替换

sed 's/test/trail/' file2			#默认替换每一行第一次
sed 's/test/trail/2' file2			#替换第二次出现的

sed -n 's/test/trail/p' file3		#p替换标记,只输出被命令修改过的行
sed 's/test/trail/w test' file2		#将替换行放入指定文件中
sed 's/\/bin\/bash/\/bin\/csh/' passwd 
=sed 's!/bin/bash!/bin/csh/!' passwd
=sed 's#/bin/bash#/bin/csh/#' passwd

sed '2,3s/dog/cat/' file1			#只变第二三行

sed 'd' file1						#删除输出不改变源文件

echo 'test line 2' | sed 'i\test line 1'	#前加
echo 'test line 2' | sed 'a\test line 1'	#后加
sed 'y/123/890/' file1						#处理单个字符其他不变

sed '/number 2/r date1' date2				#将date1 内容插在date2 number 2 后

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、awk
1、正则表达式扩展出来的一些元字符。grep不支持扩展正则表达式

?  匹配?之前字符0次或一次
+   匹配前面那些字符多次 ,0次不行
() |  结合使用,(| | |)任远的一个字符存在即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、awk样式扫描和处理语言
读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等。
awk程序由一个主输入循环维持(默认搭建好框架),主输入循环反复执行,直到条件被触发,

3、awk语句由模式和动作组成,模式决定动作何时触发,动作执行对输入行的处理

awk '/^$/{print"this is a blank line."}' input
^$ 模式  print"this is a blank line."  动作  #在$^空行时触发动作

#!/usr/bin/awk -f
/^$/{print"this is a blank line."}			#内容

./scr.awk input 							#运行

4、记录和域
awk认为输入文件为结构化,将awk输入文件的行定义为记录,行中的每个字符串定义为域,域之间用空格(可以多个)/tab(最多一个)。

awk '{print $2,$1,$4,$3}' stucode			#按域排序,默认一个空格
awk 'BEGIN {FS=","} {print $1 $3}' stucode 	#设定域的分隔符

在这里插入图片描述
5、关系和布尔运算

awk 'BEGIN {FS=":"} $1~/root/' passwd				#~匹配正则表达式,~!不匹配
awk 'BEGIN {FS=":"} {if ($3==1 || $4==10) print $0}' passwd 
#精确匹配
awk 'BEGIN {FS=":"} {if ($3<$4) print $0}' passwd 	#条件匹配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6、表达式
AWK表达式用来存储,操作和获取数据。一个awk表达式可由数值,字符常量,变量,操作符,函数,正则表达式自由组合而成。

awk '/$^/{print x++}' input				#统计空行值

#!/usr/bin/awk -f
BEGIN {FS=","}
{
	TOTAL=$4+$5+$6
	AVG=TOTAL/3
	print $1,AVG
}										#脚本内容

在这里插入图片描述
7、系统变量
改变默认值
定义系统值

NF:记录域的数量
NR:显示当前记录数
FILENAME:保存当前输入文件名

awk 'BEGIN {FS=","} {print NF,NR,$0} END {print FILENAME}' file1 

8、格式化输出
产生报表,按照一定格式输出,借鉴printf

awk 'BEGIN {FS=","} {print "%-15s\t%s\n",$1,$3} file1
#对第一个域进行修饰,改字符串长度控制为15为,并且左对其,不够空格补齐
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值