sed和awk编辑器
目录
一、sed编辑器
1. 概述
2. sed 流编辑器的工作过程
3. sed命令格式
3.1 基本操作格式
3.2 执行多条命令的格式
4. sed命令的选项操作符
4.1 常用选项
4.2 sed命令的操作符
5. 常用操作的语法演示
5.1 输出符合条件的文本
5.2 删除符合条件的文本
5.3 替换符合条件的文本
5.4 插入新行
6. sed总结
二、awk
1.概述
2. awk命令格式
3. awk的工作过程
4. awk内置变量
5. awk用法示例
5.1 按行输出文本
5.2 按字段输出文本
一、sed编辑器
1. 概述
sed 即 Stream EDitor,和 vim 不同,sed是行编辑器 。sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中, 称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。 接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
2. sed 流编辑器的工作过程
主要包括:读取、执行和显示三个过程
读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并 存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址, 否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后, 模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
PS:默认情况下所有的sed命令都是在模式空间内执行的, 因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。
3. sed命令格式
3.1 基本操作格式
sed -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
3.2 执行多条命令的格式
方法一:
sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwd
方法二:
sed -e '操作1;操作2' 文件
4. sed命令的选项操作符
4.1 常用选项
选项 | 解释 |
-e 或 --expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f 或 --file= | 表示用指定的脚本文件来处理输入的文本文件 |
-h 或--help | 显示帮助 |
-i | 直接修改目标文本文件 !!!慎用!!! |
-n | 仅显示script处理后的结果 |
4.2 sed命令的操作符
选项 | 解释 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面插入一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出,通常与“-n”选项一起使用 |
= | 打印行号 |
l | 打印数据流中的文本和不可打印的ASCII字符(比如结束符 $、制表符 \t) |
r | 扩展正则表达式 |
5. 常用操作的语法演示
5.1 输出符合条件的文本
示例:
sed -n 'p' a.txt #输出所有内容
sed -n '3p' a.txt #输出第三行
sed -n '3,5p' a.txt #输出第三到五行
sed -n '3p;5p' a.txt #输出第三行和第五行
sed -n 'p;n' a.txt #输出所有奇数行(输出一行隔一行再输出)
sed -n 'n;p' a.txt #输出所有偶数行(隔一行输出再隔一行输出)
sed -n '3,9p;n' a.txt #输出三到九行之间的奇数行
sed -n 'n;3,9p' a.txt #输出三到九行之间的偶数行
sed -n '/word/p' a.txt #输出包含"word"的行
sed -n '/abc/,/123/p' a.txt #输出包含"abc"与"123"之间的行
sed -n '/abc/p;/123/p' a.txt #输出包含"abc"或者包含"123"的行
5.2 删除符合条件的文本
sed '3d' a.txt #删除第三行
sed '3,5d' a.txt #删除第三到五行
sed '/word/d' a.txt #删除包含word的行
sed '/word/!d' a.txt #删除不包含word的行
5.3 替换符合条件的文本
sed 's/abc/123/' a.txt #将每行第一个"abc"替换为"123"
sed 's/abc/123/g' a.txt #全局替换g=global,将所有"abc"替换为"123"
sed 's/#//g' a.txt #将所有"#"替换为空字符
sed 's/^/#/ a.txt #将每行行首插入"#"
sed '3s/word/abc/ a.txt #将第三行中的"word"替换为"abc"
sed '3,5s/word/abc/ a.txt #将第三到五行中的"word"替换为"abc"
sed '/abc/,/123/s/word/num/ a.txt #将包含"abc"和"123"之间的行的"word"替换为"num"
......
5.4 插入新行
sed '/word/a123' a.txt #在所有包含"word"的行下方插入行"123"
sed '/word/i123' a.txt #在所有包含"word"的行上方方插入行"123"
sed '3a123' a.txt #在第三行下方插入行"123"
sed '3i123' a.txt #在第三行上方插入行"123"
6. sed总结
- sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
- sed -r 搭配扩展正则表达式使用,使用{n} {n,} {n,m} 不需要加“\”
- 用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i
- sed 命令 的重点在于增删改查四个功能,可以运用在脚本中对重要文件配置的修改,添加等作用尤其有效
二、awk
1.概述
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本, 默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。 以空格做为分隔符,多个空格他会自动压缩成一个。
AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理.
1、按照命令找指定的行 2、找到的行进行打印,操作 awk默认的操作就是打印
可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
2. awk命令格式
awk 选项 '操作符 {编辑指令}' 处理对象
例如:
awk '<pattern> <action>' <input-file>
操作符 指令 处理对象
3. awk的工作过程
● 第一步:执行BEGIN{ action;.... }语句块中的语句
● 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;... }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
● 第三步:当读至输入流末尾时,执行END{action;…}语句块 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块, 比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
- END语句块在awk从输入流中读取完所有的行之后即被执行, 比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
- pattern语句块中的通用命令是最重要的部分,也是可选的。 如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
4. awk内置变量
内置变量 | 解释 |
$0 | 当前处理的行的整行内容 打印所有 |
$n | 当前处理行的第n个字段(第n列) |
NR | 当前处理的行的行号(序数) |
NF | 当前处理的行的字段个数。$NF代表最后一个字段 |
FS | 列分割符。指定每行文本的字段分隔符,输入内容的分隔符, 默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用="" |
OFS | 输出内容的列分隔符 |
FILENAME | 被处理的文件名 |
RS | 行分隔符。awk从文件中读取资料时, 将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是"\n" |
5. awk用法示例
5.1 按行输出文本
awk '{print}' a.txt #输出所有内容,类似于cat
awk '{print $0}' a.txt #同上,"$0"代表整行内容
awk '{print NR}' a.txt #打印行号
awk '{print NR,$0}' a.txt #打印行号+所有内容
awk 'NR==3{print}' a.txt #打印第三行内容
awk 'NR==3,NR==5{print}' a.txt #打印第三到五行内容
awk '(NR>=3)&&(NR<=5){print}' a.txt #同上
awk 'NR==3;NR==5{print}' a.txt #打印第三行和第五行内容
awk 'NR%2==0{print}' a.txt #打印偶数行内容
awk 'NR%2==1{print}' a.txt #打印奇数行内容
awk '/^word/{print}' a.txt #打印以"word"开头的行
awk '/word$/{print}' a.txt #打印以"word"结尾的行
5.2 按字段输出文本
awk '{print $3}' a.txt #打印每行第三个字段(列)的内容
awk '{print $3,$5}' a.txt #打印每行第三列和第五列的内容
awk -F: '{print $3}' a.txt #打印以":"作为分隔符,每行第三个字段的内容
awk -F: '$3>10{print}' a.txt #打印以":"为分隔符,第三个字段大于10的每行内容
awk '{if($3>10){print}}' a.txt #同上
awk '$5~"word"{print $3,$NF}' a.txx #打印第五字段包含"word"所在行的第三个字段和最后一个字段
awk '($3=="word")&&($5=="name"){print}' #打印第三个字段为"word"且第五个字段为"name"的行