shell 中的sed awk

sed :stream editor

可以对某一行进行操作,由名字可知,其能完成对文件的非交互式的编辑工作。

用法sed [options]{commands}[flags] [file]

options主要有-n代表阻止内存输出到屏幕-f 代表后接命令文件 -e说明可以多点编辑 -i可以直接修改文件内容

commands:

s/pattern/content/将pattern 匹配到的替换为content;
1i content 在第一行前插入一行内容为content
2c content 将第2行替换为content
2 d 删除第2 行
3 p 打印第三行

num文件内容:

12 234 1344
12 223 45
1 324 212 

shell 命令演示

sed -e 's/^/start/' -e 's/$/end/' num # -e可以将多个命令一块编辑在一行中 s代表替换
sed 's/12/[&]/g' num# &可以代表被匹配的字符串 从而可以加上某些字符
sed '1i 123 123 123' num #i是插入一行 表示在第一行前面插入一行123 123 123
sed '3a 123 1231 1123' num #a是append 与i同理
sed '/234/i ni niu a ' num# 可以通过匹配来添加行 这样就在第一行前插入了ni niu a 
sed '2 c niniua' num #c命令是替换行 这样就将第2行替换为niniua
sed '2 d ' num#d命令是删除行 这样就删除了第2行
sed -n '3p' num #打印第3行 
sed -r 's/(.*)/Welcome \1/g' #输入名字之后 打出欢迎 name
#前面我们大致说了 sed 增删改查 等多个操作

sed是按照行处理数据数据,将第一行读入pattern space ,然后用命令处理,完成后被输出到屏幕。再读入下一行重复此过程。

什么是Pattern space 什么是Hold Space

	Pattern space 相当于是加工车间需要进行对原始数据的操作 
	而 Hold Space 是对这些操作之后的数据的存放地点

应用如果我们想倒序按行输出num文件的内容该这样

sed '1!G;h;$!d' num

g :将hold space 的内容复制到 pattern space
G:将hold space 的内容追加到pattern sapce
h:将pattern space 的内容复制到 hold space
H:将pattern space 的内容追加到hold sapce

awk awk 可以说是一门语言。

其中包括BEGIN{} 部分必须要执行的部分{}和END部分。

其中begin 部分 一般是 变量的初始化 end部分是变量最后的输出 中间的{}部分完成主要的工作
begin 部分和END部分不是必须的。
awk 可以按行处理,截取某一列的数据。可以看出awk 做的是预处理 逐行处理 最后处理

	awk '{print $1,$2}' num#打印第一列第二列中间以空格分隔
	awk '{if(NR==2){print $0;}}' num#打印第2行的内容 也可用下一行代码替代
	awk 'NR==2{print $0}' num#打印第2行的内容
	#在中间的逐行处理部分可以有条件判断、流程控制等程序设计语言常用的部分
	awk '$1 == 12' num #每行记录若为12 则输出该记录
	awk 'BEGIN{OFS="-"}{print $1,$2,$3}' num #输出分隔符“-” 如果需要自己指定分隔符使用FS="xx" 或者用-F"xx"
	awk '/34*/' num #3后面可以跟0个或者多个4
	awk '/34+/' num#3后面可以跟1个或者多个4
	awk '/34?/' num#3后面可以跟0个或者1个4
	awk '/34./' num#34后面可以跟任意一个字符但是不能不跟字符
	awk '34{1,2}/' num#3后面可以跟1个或2个4
	awk '34[0-9]/' num#34后面跟一个数字
	#上面就是正则匹配的知识
	

利用awk拆分文件

	awk '{if(NR%2==1){++p;print >p".txt"}else{print >p".txt"}}' num #将文件 按2行一个文件拆为多个文件
	awk  '{if ($3 ~/1344/){print >"1.txt"}else if($3 ~/45/){print >"2.txt"}else{print >"3.txt"}}' num#
	#按照 一定的模式匹配 拆分文件

例子

每个用户的进程占了多少内存

awk  '{if ($3 ~/1344/){print >"1.txt"}else if($3 ~/45/){print >"2.txt"}else{print >"3.txt"}}' num
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值