目录
一、sed 命令
1.1 sed的概况
sed 为行编辑器,是处理文件行的编译器。sed是从文件中读取行,处理行,输出行。每当处理一行时会先把处理的行储存在临时缓存区中,也称为模式空间。接着用sed的命令去处理缓存区的内容等到处理完缓存区的内容后最后会把缓存区的内容送到屏幕。
sed可以读取文本并按照需求对文本进行编辑,所以可以运用在无交互的情况下对文件进行处理常常被广泛运用于shell脚本中去完成一些自动化任务。
1.2 sed的原理
1.3 sed 命令的用法
结构:
sed 【选项】 '操作' 参数
1.3.1 常见的选项
选项 | 功能 |
-e | 用指定的命令或脚本来处理文件 |
-f | 用指定的脚本文件来处理文件 |
-n | 仅显示处理后的结果 |
-i | 对文件处理直接修改 |
-r | 使用扩展正则表达式 |
-s | 将多个文件当作独立的文件 |
-h | 帮助 |
1.3.2 常见的操作
操作 | 功能 |
a | 在当前行下增加内容 |
c | 替换选定行的内容 |
d | 删除指定行 |
i | 在指定行上插入一行内容 |
p | 打印内容 |
s | 替换指定的内容 |
y | 字符转换 |
1.4 sed 用法实例
1.4.1输出条件的文本
①输出指定的文本
②输出3-6行
③输出所有的奇数行
④输出所有偶数行
⑤输出含有root的行
⑥显示包含root的行
⑦输出以nologin结尾的行
1.4.2 删除条件文本
①删除第五行(nl为文件计数行数)
②删除5-10行
③删除包含root的行
④删除以a-e字母开头的行
1.4.3 替换文本内容
①把文中的每一行第一个root替换成ROOT
②把每行第二个t替换成T
③把所有行的t换成T(g表示全局的意思)
④在每一行首行插入#
⑤将含有root的行中的oo改为ee
⑥在含有root的行上加上new(i)
⑦在含有root的行下插入new(a)
1.4.4 迁移文本
常用参数:
H 复制到剪贴板
g,G 将复制内容粘贴
w 保存到某个文件
r 读取某个文件
a 追加指定内容
i 忽略大小写
d 删除
①将含有root的行剪贴到最后结尾
②把1-3行剪贴到第七行后
③将文件/etc/hostname的内容添加到含有root的行后
④在第三行下加入ww换行www内容
⑤将含有root的行保存到/home/ss
1.4.5 直接修改内容(-i)
例如:sed -i ‘s/root/ROOT/’ /etc/passwd
把root修改成大写的ROOT 这是对文件免交互的修改
所以我们再修改前要-i.bak 进行备份防止修改错误改不回去
二、awk命令
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
2.1 常用格式
awk可以直接处理目标文件,也可以通过-f 去读取脚本对目标文件进行处理
格式:
awk 选项 ‘条件{指令}’ 文件1 文件2 过滤并输出文件符合条件的内容
awk -f 脚本文件 文件1 文件2 从脚本中调用编辑的指令,并且过滤输出内容
在使用 awk 命令的过程中,可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可
以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。
2.2 awk的内置变量
变量 | 功能 |
FS | 指定每行文本的字符分隔符,默认为空格或者制表位 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号 |
$0 | 当前处理的行的整行的内容 |
$n | 当前处理行的第n个字段 |
FILENAME | 被处理文件的名字 |
RS | 数据记录分隔,默认为\n |
2.3 awk的基本用法
①打印出passwd的以:为分隔符的第二列
②打印出passwd的以:为分隔符的第二列和第三列
2.3.1 awk的常用内置变量例题
①打印出包含root的一整行内容
②打印以:为分割符的每一行的列数
③显示出包含root的行数
④显示出包含root的行数和整行的内容
⑤打印第五行内容
⑥打印出最后一列的内容
⑦打印出总行数(END表示汇总)
⑧显示文件第几行有几列
⑨打印出内存使用百分比
⑩查看网卡ip和流量
2.3.2 BEGIN和END
BEGIN一般用来做初始化操作,在读取数据记录之前执行一次
END 一般用来汇总,在读取数据记录后执行一次
BEGIN可以进行运算
先写’BEGIN{x=0}; ;END{print x}’ ,然后再写中间的匹配// 以/bin/bash结尾 ,因为/有其他匹配的意思,要加转义符号\ ,最后再加{x++},转到下一行
扩展:
BEGIN语句块在awk开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
2.3.3 模糊匹配
~表示包含,!~表示不包含
①打印出第一列里包含root的
②打印出第一列不包含root的
2.3.4 数值与字符串的比较
比较的符号:== !== <= >= < >
① 打印出第五行的内容
②打印出小于五行的行
③打印出第三列小于100的行
④打印出第三列小于10或者大于1000的行
⑤打印出二到三行
⑥打印出1-100能被4整除且包含4的数
2.3.5 其他内置变量用法
FS:输入字段的分隔符 默认是空格
OFS:输出字段的分隔符 默认也是空格
NR : 当前处理行的行号,从1开始
FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
RS:输入行分隔符 默认为换行符
ORS:输出行分隔符 默认也是为换行符
①打印出以冒号作为分隔符的(FS表示以什么作为分隔符)
②打印出以:为分隔符的第一列和第二列并且输出时中间要以---为分割(OFS定义输出时的分隔符)
③RS:指定以什么为换行符,这里指定是冒号,你指定的肯定是原文里存在的字符
④ORS表示输出时不换行
2.3.6 调用函数getline
定义一个变量并应用变量(-v表示调用)
直接定义并调用变量
getline表示打印出第二行内容
显示奇数偶数行
2.3.7 awk中的if语句
单分支为if(){}
双分支为if(){}else{}
多分支为if(){}else if(){}else{}
①第三列小于10的行打印出
②打印出第三列小于10的否则打印第一列
数组:
总结
1.sed 工具除了调用文件或者脚本执行命令
sed可以读取文本并按照需求对文本进行编辑,所以可以运用在无交互的情况下对文件进行处理常常被广泛运用于shell脚本中去完成一些自动化任务。
sed -i 就是表示在文件中正式的修改,所以在进行修改时要i.bak进行备份
常用格式:sed 【选项】 '操作' 参数
2.awk 在进行操作时要加上' {} ',否则操作不了
awk 的NR表示行,$0表示整行,所以要打印是可以打印NR表示行号。