LINUX下的shell脚本-sed和awk命令

一.sed命令

sed是stream editor的缩写。是一个非交互式上下文编辑器

Sed的工作原理:

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中(“模式空间“),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

Sed的优势:

  • Sed编辑器以批处理的方式来编辑文件,这比交互式编辑器(如vim)要快,可以快速的完成对数据的编辑修改。
  • 可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件,能够减少可观的键入和随之带来的错误。

Sed劣势:

相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。

sed的使用:

1.sed命令参数

sed [参数] '命令' file
	p	##显示
	d	##删除
	a	##添加
	c	##替换
	i	##插入

2.参数
1)-e选项(默认情况):在处理输入时,sed后面直接添加编辑命令

sed -e ‘命令’ file
sed -e 's/root/ROOT/g' /etc/passwd  ##将/etc/passwd文件中root替换ROOT

在这里插入图片描述
一条编辑命令时,-e选项可以省略。但是当一条sed语句中执行多个编辑命令时,不可以省略。
在这里插入图片描述
2)-f选项:在处理输入时,使用sed脚本。将所用到的sed编辑命令写入一个文件,然后使用sed -f来读取该文件:

vim script.sed
$ cat script.sed
$ s/root/ROOT/g
$ s/bin/BIN/g
$ s/home/HOME/g
sed -f script.sed /etc/passwd

3)-n:不产生命令输入

sed -n 's/root/ROOT/g' /etc/passwd

使用-n选项不会将内容输出到屏幕上,通常结合p命令使用用来打印被匹配的行

sed -n '/^#/p' /etc/fstab   ##将/etc/fstab文件中以#开头的行输出

在这里插入图片描述
4)-i:改变原文件内容

sed -i 's/westos/redhat/' passwd
sed -i 's/westos/redhat/g' passwd	##全局替换

二.使用sed命令进行文本处理

1)使用sed命令进行文本打印

sed -n '/\:/p' /etc/fstab
sed -n '/^#/p' /etc/fstab
sed -n '/^#/!p' /etc/fstab
sed -n '2,6p' /etc/fstab  	##打印/etc/fstab中2-6行
sed -n '2,6!p' /etc/fstab 	##将/etc/fstab中除了2-6行打印出来
sed -n '1~2p' /etc/fstab	##打印奇数行
sed -n '2~2p' /etc/fstab	##打印偶数行

在这里插入图片描述
在这里插入图片描述
2)使用sed命令删除行
sed使用d命令来删除文本中的特定行。

sed '/^UUID/d' /etc/fstab 
sed '/^#/d' /etc/fstab 
sed '/^$/d' /etc/fstab 
sed '1,4d' /etc/fstab 

在这里插入图片描述
在这里插入图片描述
3)使用sed命令附加文本
sed编辑器使用a命令来向数据流附加文本行,a命令会在指定行后增加一个新行。

sed '/hello/aworld' westos
sed 's/hello/hello world/g' westos
sed 's/hello/hello\nworld/g' westos

4)使用sed命令替换行
使用c可以将数据流中整行文本修改为新的行

sed '/hello/chello world' westos

在这里插入图片描述
5)使用sed命令插入文本
sed编辑器使用i命令来向数据流中插入文本行,i命令会在指定行前增加一个新行

sed '/hello/iworld\nwestos' westos

在这里插入图片描述

三.使用sed命令处理文件

1.向文件中写入数据

sed '1,2w test.txt' /etc/passwd 

将数据流中的/etc/passwd中的第1,2行写入到文件test.txt中去
2.从文件中读取数据
使用r命令来将一个文本中的数据插入到数据流中

sed '3 r test.txt' /etc/passwd

将文件test.txt中内容插入到数据流第三行后面

四.awk报告生成器

1.awk处理机制:根据模式一次从文件中抽取一行文本,对这行文本进行切片(默认使用空白字符作为分隔符)

[root@server mnt]# cat test
this  | is | a | file
 $1     $2  $3    $4

在这里插入图片描述
2.awk常用变量

awk '{print FILENAME,NR}' /etc/passwd	##输出文件名,和当前操作的行号
awk -F: '{print NR,NF}' /etc/passwd	##输出每次处理的行号,以及当前以":"为分隔符的字段个数

总结:awk ‘{print “第NR行”,“有NF列”}’ /etc/passwd

awk -F 分隔符 BEGIN{}{}END{} FILENAME

BEGIN{}:读入第一行文本之前执行的语句,一般用来初始化操作
{}:逐行处理
END{}:处理完最后以行文本后执行,一般用来处理输出结果

NR 				#行数
NF 				#列数
FILENAME 		#文件名称本身
westos 			#westos变量值
“westos” 		#westos字符串

/bash$/ 		#条件
/条件1|条件2/ 	#条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1并且条件2

$0 				#所有的列
$1 				#第一列
$2 				#第二列
awk 'BEGIN { a=34;print a+10 }'
awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd 		##文件开头加REDHAT,末尾加WESTOS,打印行号和内容
awk -F: '/bash$/{print}' /etc/passwd	##输出以bash结尾的
awk -F: 'NR==3 {print}' /etc/passwd    
awk -F: 'NR % 2 == 0 {print}' /etc/passwd	##偶数行    
awk -F: 'NR >=3 && NR <=5 {print }' /etc/passwd    
awk 'BEGIN{i=0}{i+=NF}END{print i}' linux.txt	##统计文本总字段个数

awk案例:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量

awk -F : '/bash$/&& $6!~/home/ {print }' /etc/passwd
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值