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


  • 1.sed
    • 1.1 sed的作用
    • 1.2 显示文件的第n行
    • 1.3 显示文件前n行
    • 1.3 显示前n行以外的内容
    • 1.4 显示文件第n后和之后的m行
    • 1.5 在第n行前面插入内容
    • 1.6 替换文件的第n行
    • 1.7 在文件的最后插入行
    • 1.8 复制粘贴
    • 1.9 删除空行
    • 1.10 查找并保存
    • 1.11 文件重定向
  • 2.awk
    • 2.1 简介
    • 2.2 自定义显示年月日
    • 2.3 awk文件操作
    • 2.4 判断多个条件

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 May1 18:42:41 CST 2018 [root@iz2zeisjfk2rw89yhp3g19z shtest]# date | awk '{print "Year:"$6 "\t Month:"$2 "\tday:" $3}' Year:2018Month:Mayday: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 "namelevel 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

【SHELL编程(三) sed和awk的用法】与条件:
awk '{if($1=="andy" && $2=="9")print $0}' result.txt

    推荐阅读