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
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 复制粘贴
sed "2,4H; 10G" file.txt
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
[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