第五天:文本处理三剑客下grep 、sed 、awk
一、grep 对目标文本逐行进行匹配检查,打印匹配到的行
二、sed : stream editor 文本编辑工具
1、sed为行编辑器,一行行读取,一行行输出。把当前处理的行存储在临时缓冲区:模式空间(pattern space)
2、sed基本用法: sed [option]... 'script' [inputfilt]
-n 不输出 模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r,-E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件 流
seq 10 | sed '1~2p' 间隔2输出
3、sed高级用法
sed中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能
P 打印模式空间开端至\n 内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加到保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出数据追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式 空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。
三、awk:实现gawk,文本报告生成器
1、报告生成顺,模式化文本输出
https://www.gnu.org/software/gawk/manual/gawk.html
https://man7.org/linux/man-pages/man1/awk.1p.html
2、格式
program 通常是被放在单引号中,并可以由三种部分组成: BEGIN语句块、模式匹配的通用语句块、END语句块
常见选项:-F 指明输入时用到的字段分隔符 -v var=value变量赋值
3、工作流程
4、awk控制语句
5、动作print
逗号分隔符
输出item可以字符串,也可是数值; 当前记录的字段、变量或awk的表达式
如省略item,相当于print $0
固定字符符需要用“” 引起来,而变量和数字不需要
6、awk 变量
(1)内置变量
FS:输入字段分隔符,默认为空白字符,功能相当于 -F
OFS:输出字段分隔符,默认为空白字符
RS:输入记录record分隔符,指定输入时的换行符
ORS:输出记录分隔符,输出时用指定符号代替换行 符
NF: 字段数量
NR: 记录的编号
FNR: 各文件分别计数,记录的编号
FILENAME:当前文件名
ARGC: 命令行参数的个数
ARGV: 数组,保存的是命令行所给定的各参数,每一个参数:ARGV[0],...
(2)自定义变量:区分字符大小写
-v var=value
在program 中直接定义
7、动作:printf
必须指定FORMAT
不会自动换行,需要显示给出换行 控制符\n
FORMAT中需要分别为后面每个item指定格式符
8、操作符
9、模式PATTERN
根据pattern条件,过滤匹配的行,再做处理
如果未指定:空模式,匹配每一行
/regular expression/: 仅处理能够模式匹配到的行,需要用/ / 括起来
relational expression :关系表达式,结果为“真”才会被处理
line ranges: 行范围; 不支持直接用行号,但可以使用变量NR间接指定行号
BEGIN/END 模式:
10、条件判断:
if-else
switch
while
do -- while
for
continue和break
next:提前结束对本行处理而直接进入下一行处理
11、数组:为关联数据,array_name[index-expression]
利用数徐若给,实现k/v功能
可使用任意字符串; 字符串要使用双引号括起来
如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为”空串“
若要判断数组中是否存在某元素,要使用”index in array “格式进行遍历
12、awk函数
(1)内置函数:
rand():返回0和1之间一个随机数
srand();配合rand()函数,生成随机数的种子
int():返回整数
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2
system('cmd'):可以在awk中调用shell命令
systime():当前时间到1970年1月1日的秒数:https://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions
strftime():指定时间格式
(2)自定义函数
function name(p,p,p...)
{
}
13、awk脚本
将awk程序写成脚本,直接调用或执行
14、