shell脚本里的sed和awk
一、sed
1.1、sed的原理
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本中。
1.2、sed的流程
sed 的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出或者sed -i.
1.3、sed命令格式
1
2 sed -e '操作' 文件1 文件2..
3
4 sed -n -e '操作1;操作2' 文件1 文件2 ..
5
6 sed -f 脚本文件 文件1 文件2 ...
7
8 sed -i -e '操作' 文件1 文件2 ...
9 sed -e 'n {
10 操作1
11 操作2
12 }' 文件1 文件2 ...
常用选项
选项 | 作用 |
-e或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f或--file= | 表示用指定的脚本文件来处理输入的文本文件 |
-h或--help | 显示帮助 |
-n、--quiet或silent | 禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
-i | 直接修改目标文本文件 (建议先验证命令或备份目标文件) |
-r | sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) |
常用操作
操作 | 作用 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面增加一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。 |
= | 打印行号 |
l(小写L) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
二、awk命令的定义
2.1、awk的命令原理
逐行读取文本,默认以空格或tab键为分割符进行分割,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的整理,而awk命令比较倾向于将一行分成多个“字段”然后再进行处理。
awk信息的读取也是整行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的工程中,可以使用逻辑操作符,"&&" 表示"与"、"||"表示"或"、"!"表示"非",还可以进行简单的数学运算。
2.2、awk的命令格式
awk 选项 '模式或条件 {操作}' 文件1 或 文件 2
awk -f 脚本文件 文件1 文件 2
2.3、awk的内建变量
(1)FS
列分隔符。指定每行文本字段的分隔符,默认为空格和制表位。与"-F"作用相同。
(2)NF
当前处理行的字段个数
(3)NR
当前处理行的行号
(4)$0
当前处理行的整行内容
(5)$n
当前处理行的第n个字段
(6)FILENAME
被处理的文件名
(7)RS
行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n'
三、awk命令的运用
3.1、打印磁盘使用情况
1 [root@localhost ~]# df |awk '{print $5}'
2 已用%
3 9%
4 0%
5 0%
6 2%
7 0%
8 4%
9 1%
10 1%
11 100%
12 0%
3.2、提取ip地址和mac地址
ip地址
1 [root@localhost ~]# ifconfig | sed -n '2p' |awk '{print $2}'
2 192.168.139.100
mac地址
1 [root@localhost ~]# ifconfig | sed -n '3p' |awk '{print $2}'
2 fe80::2117:15fb:ca99:7599
3.3、根据列分隔符提取
FS∶ 列分割符提取列
使用分隔符过滤出root用户和它使用的shell
[root@localhost ~]# cat /etc/passwd|awk -F ":" '/^root/ {print $1,$NF}'
root /bin/bash
NR
当前处理的行的行号
查看用户zs的行号
1 [root@localhost ~]# awk -F":" '/^zs/ {print $1,NR}' /etc/passwd
2 zs 41