(3)替换符合条件的文本
——将每行的第一个the替换为THE
——将每行中的第二个l替换为L
——每行开始添加#字符(其实就是把开头换成#)
——将3-5行的所有的the替换为THE(3,5就是三到五行,后面加了g就是所有的意思)
(4)迁移符合条件的文本
操作符:
- H 复制到剪贴板;
- g,G 将剪贴板中的数据覆盖/追加到指定行;
- w 保存为文件;
- r 读取指定文件;
- a 追加指定内容
——将包含the的行,迁移到行尾(;用于多个操作,和管道符差不多,H复制到剪贴板---d删除---$G追加到行尾)
——将1-5行迁移到17行后
——将包含the的行另存为新文件(w就是另存为,另存为到out.file)
——在包含the每行后添加文件hostname内容(/the/r就是包含the的每行后面都加上/etc/hostname的内容,也就是读取了指定文件的内容)
——在第3行后插入新行,内容为New (a也就是添加了指定内容)
(5)使用脚本编辑文件
使用sed脚本,将多个编辑指令存放到文件中(每一行一条编辑指令),通过 -f 的方式调用
——将1-5行迁移到17行后
使用sed:
使用脚本:
效果其实是一样的
三、awk工具
简介:
awk是行处理器
,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题
,通常用来格式化文本信息
(1)awk工作流程
#awk -F ‘:’ ‘{print $1,$3,$4}’ /etc/passwd
按这条命令来说:
- awk命令会
逐行读取文件的内容
进行处理 - awk以’:’为分隔符,将第1行数据格式化为7段,每段数据存入$1–$7变量中。$0存储这1行数据,-F即是按什么字符来分割,这里写的就是-F:,说明以:来分割
- 一行处理完成继续处理下一行,直到此文件读取结束
执行完命令后的结果:
(2)awk常见用法
- awk 选项 ‘模式或条件 { 编辑指令 }’ 文件1 文件2 …
- awk -f 脚本文件 文件1 文件2 …
(3)特殊的内建变量
$0 表示整个当前行 $1 每行第一个字段 NF 字段数量变量 NR 每行的记录号,多文件记录递增 FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始 \t 制表符 \n 换行符 FS BEGIN时定义分隔符 RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) ~ 匹配,与==相比不是精确比较(包括) !~ 不匹配,不精确比较 == 等于,必须全部相等,精确比较 != 不等于,精确比较 && 逻辑与 || 逻辑或 + 匹配时表示1个或1个以上 /[0-9][0-9]+/ 两个或两个以上数字 /[0-9][0-9]*/ 一个或一个以上数字 FILENAME 文件名 OFS 输出字段分隔符, 默认也是空格,可以改为制表符等 ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 -F'[:#/]' 定义三个分隔符 {print} 类似于显示的意思,后面可以跟$位置变量显示相应的字段
用法示例:
(1)按行输出文本
——输出1-3行内容(NR==即是指定行数)
这里(NR>=1)&&(NR<=3)和上面的NR==1,NR==3意思其实是一样的
——输出奇数行(%2求模运算,余数为1是奇数,0为偶数 )
——输出偶数行
——统计以/bin/bash结尾的行(和grep -c "/bin/bash$"其实是一样的,grep的更简单一点,看个人喜好)
(2)按字段输出文本
(这个感觉更常用一点,用法(1)的grep也能做到)
——输出每行中以空格分割的第3个字段(运用了位置变量与之配置,不加-F即默认是空格来分割)
——密码为空的行 (我这个没有密码为空的用户所以筛选不出来)
——输出第7个字段不是/bin/bsh也不是/sbin/nologin的行(!=就是不相同)
(3)通过管道符、双引号调用shell命令
示例1:
条件:调用wc -l 命令统计使用bash的用户个数
- 使用awk工具执行
使用grep命令执行
(效果是一样的)
示例2:
条件:调用w命令,统计在线用户数
- 使用awk工具执行
使用常规命令执行 (所得减去2就是在线用户数量,可以先试试w这个命令,前两行是时间日期等)
主要是看敲完命令后的效果,发现规律后就很好理解了,选项虽然多,但是好多也不常用,有时间的话记一下就可以,也不用全都记住,但是最起码给一个sed这类的表达式什么的得能看懂