目录
[3.1 输出符合条件的文本](#3.1 输出符合条件的文本)
[3.2 删除符合条件的文本](#3.2 删除符合条件的文本)
[3.3 替换符合条件的文本](#3.3 替换符合条件的文本)
[3.4 插入新行](#3.4 插入新行)
[2. awk命令格式](#2. awk命令格式)
[5.1 按行输出文本](#5.1 按行输出文本)
[5.2 按字段输出文本](#5.2 按字段输出文本)
一、sed
1.概述
sed是一个强大的文本处理工具,其名称是Stream Editor(流编辑器)的缩写。它被设计用于根据用户定义的规则对文本进行逐行处理和转换。
Sed通过从输入流中逐行读取文本,并根据用户指定的命令来对每一行进行处理。
2.sed命令格式
sed "选项" "操作语法" "参数"
常用选项 | 解释 |
---|---|
-n | 不进行打印输出 |
-i | 直接对源文件进行编辑 |
-f | 表示用指定的脚本文件来处理输入的文本文件 |
-r | 使用扩展正则表达式 |
-e | 多点编辑 |
常用操作语法 | 解释 |
---|---|
s | 替换指定字符 |
d | 删除指定行 |
a | 指定行下方插入行 |
i | 指定行上方插入行 |
c | 替换指定行 |
y | 字符转换,转换前后字符长度必须相同 |
p | 打印 |
3.常用操作的语法演示
3.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"的行
3.2 删除符合条件的文本
sed '3d' a.txt #删除第三行
sed '3,5d' a.txt #删除第三到五行
sed '/word/d' a.txt #删除包含word的行
sed '/word/!d' a.txt #删除不包含word的行
......
3.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"
......
3.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"
二、awk
1.概述
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。
2. awk命令格式
awk 选项 '操作符 {编辑指令}' 处理对象
- { }外指定条件,{ }内指定操作
3.awk工作过程
- 执行BEGIN{action;... }语句块中的语句。
- 从文件或标准输入(stdin)读取一行,然后执行pattern{ action;... }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
- 当读至输入流末尾时,执行END{action;...}语句块
- BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
- END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
4.awk内置变量
内置变量 | 解释 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位(tab) |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号 |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第 n 个字段(第 n 列) |
OFS | 输出内容的列分隔符 |
FILENAME | 被处理的文件名 |
RS | 行分隔符 |
5.awk用法示例
5.1 按行输出文本
bash
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 按字段输出文本
bash
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"的行