目录
一、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"的行