sed和awk编辑器

目录

一、sed编辑器

[1. 概述](#1. 概述)

[2. sed 流编辑器的工作过程](#2. sed 流编辑器的工作过程)

[3. sed命令格式](#3. sed命令格式)

[3.1 基本操作格式](#3.1 基本操作格式)

[3.2 执行多条命令的格式](#3.2 执行多条命令的格式)

[4. sed命令的选项操作符](#4. sed命令的选项操作符)

[4.1 常用选项](#4.1 常用选项)

[4.2 sed命令的操作符](#4.2 sed命令的操作符)

[5. 常用操作的语法演示](#5. 常用操作的语法演示)

[5.1 输出符合条件的文本](#5.1 输出符合条件的文本)

[5.2 删除符合条件的文本](#5.2 删除符合条件的文本)

[5.3 替换符合条件的文本](#5.3 替换符合条件的文本)

[5.4 插入新行](#5.4 插入新行)

[6. sed总结](#6. sed总结)

二、awk

1.概述

[2. awk命令格式](#2. awk命令格式)

[3. awk的工作过程](#3. awk的工作过程)

[4. awk内置变量](#4. awk内置变量)

[5. awk用法示例](#5. awk用法示例)

[5.1 按行输出文本](#5.1 按行输出文本)

[5.2 按字段输出文本](#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总结

  1. sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
  2. sed -r 搭配扩展正则表达式使用,使用{n} {n,} {n,m} 不需要加"\"
  3. 用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i
  4. 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"的行
相关推荐
a_安徒生19 分钟前
linux安装TDengine
linux·数据库·tdengine
追风赶月、26 分钟前
【Linux】线程概念与线程控制
linux·运维·服务器
小字节,大梦想28 分钟前
【Linux】重定向,dup
linux
CP-DD39 分钟前
Docker 容器化开发 应用
运维·docker·容器
blessing。。1 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
2202_754421542 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
努力的悟空2 小时前
国土变更调查拓扑错误自动化修复工具的研究
运维·自动化
运维&陈同学2 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
周末不下雨3 小时前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu