SHELL编程(三) sed和awk的用法

版权声明:本文为博主原创文章,未经博主允许禁止转载(http://blog.csdn.net/napoay) https://blog.csdn.net/napoay/article/details/80157226

1.sed

1.1 sed的作用

sed是strea editor的简称,是一种在线编辑器,它每次处理一行的内容,把当前处理的行存储在模式空间(缓冲区)中,接着使用sed命令处理缓冲区的内容,处理完以后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件的内容没有发生改变,除非使用重定向向存储输出。

sed主要用来自动编辑一个或多个文件,简化对文件的反复操作。

语法:

sed [options] '[command]' [filename]

options:
-n :读取下一行
-e: 执行多个sed指令
-f:运行脚本
-i:编辑文件内容
-i.bak:编辑的同时创造.bake的备份
-r: 使用拓展的正则表达式

command:
a: 在后面追加
i:在匹配后插入
p:打印
d:删除
r/R:读取文件、读取一行
w:另存
s:查找
c:替换
h/H:拷贝/追加缓冲区到存放空间
g/G:从存放空间取回/追加到缓冲区
x:两个空间内容交换
n/N:拷贝、追加下一行内容到当前
D:删除\n之前的内容
P:打印\n之前的内容
b:无条件跳转
t:满足匹配后的跳转
T:不满足匹配时跳转

1.2 显示文件的第n行

sed -n "np" filename #n为要显示的行号

例如,显示file.txt的第三行:

sed -n "3p" file.txt 

1.3 显示文件前n行

sed -n "1,np" filename

例如,显示file.txt的前三行:

sed -n "1,3p" file.txt

1.3 显示前n行以外的内容

sed -n '1,n! p' filename

例如:显示file.txt除前三行意外的内容:

sed -n "1,3! p" file.txt

1.4 显示文件第n后和之后的m行

sed -n "n,-mp" filename

例如,显示文件的第三行和第三行后面的四行:

sed -n "3,+4p" file.txt 

1.5 在第n行前面插入内容

命令:

sed "n i content " filename

例如,向file.txt的第三行插入字符串“abc”:

sed "3 i abc" file.txt 

1.6 替换文件的第n行

命令:

sed 'n c content' filename

例如,把文件的第三行替换为abc:

sed '3 c abc' file.txt 

1.7 在文件的最后插入行

sed "$ a content" filename

例子,在file.txt的最后一行插入字符串“abc”:

sed " $ a abc " file.txt 

1.8 复制粘贴

例如,把文件的第2行到第4行复制粘贴到文件的第10行:

sed "2,4H; 10G" file.txt 

把文件的第2行到第4行复制粘贴到文件末尾:

sed "2,4H; $G" file.txt 

1.9 删除空行

sed '/^$/d' a.txt > b.txt

1.10 查找并保存

查找包含特定字符的行并保存:
例如,查找含有‘5‘的行,保存到new.txt中:

sed '/5/ w new.txt' file.txt

1.11 文件重定向

sed不会改变文件的内容,如果想保留编辑的内容,使用重定向。
例如,把file.txt的第三行以及第三行后面的四行打印,并输出到a.txt中。

sed -n '3,+4p' file.txt >a.txt

2.awk

2.1 简介

awk是一种优良的文本处理工具,Linux及Unix环境中功能最强大的数据处理引擎之一。
其功能取决于一个人拥有的知识。

awk的语句都是由模式和动作组成的,一个awk脚本可以有多个语句,模式决定动作语句的触发条件和触发时间。

特殊字段;
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
END语句统计输出结果,在动作之后执行。
默认分隔符是空格,也可以使用-F改成其他分隔符,例如使用冒号分割:-F:

2.2 自定义显示年月日

[root@iz2zeisjfk2rw89yhp3g19z shtest]# date
Tue May  1 18:42:41 CST 2018
[root@iz2zeisjfk2rw89yhp3g19z shtest]# date | awk '{print "Year:"$6 "\t Month:"$2 "\tday:" $3}'
Year:2018    Month:May  day:1

2.3 awk文件操作

把下面的内容写入result.txt:

andy 4 85 92 78 94 88
bob 6 89 90 75 90 86
claire 9 84 88 80 92 84
dave 5 94 52 84 86 NA

$0显示所有的内容,$1显示第一列:

[root@iz2zeisjfk2rw89yhp3g19z shtest]# awk '{print $0}' result.txt 
andy 4 85 92 78 94 88
bob 6 89 90 75 90 86
claire 9 84 88 80 92 84
dave 5 94 52 84 86 NA
[root@iz2zeisjfk2rw89yhp3g19z shtest]# awk '{print $1}' result.txt 
andy
bob
claire
dave

显示result.txt的第一列和第三列:

awk '{print $1,$3}' result.txt 

打印文件头和文件尾:

awk 'BEGIN{print "name  level result"}{print $1,$2,$3} END{print "end of the file"}' result.txt 

结果:

[root@iz2zeisjfk2rw89yhp3g19z shtest]# awk '$2 >= 5' result.txt 
bob 6 89 90 75 90 86
claire 9 84 88 80 92 84
dave 5 94 52 84 86 NA

以冒号作为分隔符,打印/etc/passwd的第一列

awk -F":" '{ print $1 }' /etc/passwd

2.4 判断多个条件

或条件:

awk '{if($1=="andy" || $2=="9")  print $0}' result.txt 

与条件:

awk '{if($1=="andy" && $2=="9")  print $0}' result.txt 
阅读更多

扫码向博主提问

mydpp

博客专家

熟悉Lucene、ES、ELK
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页