awk
awk可以理解为文本处理工具,我们现在使用的awk其实是gaswk
sed,awk,grep linux三剑客
sed主要是编辑文本
grep 查找
awk格式化文本内容
awk基本语法
awk [options] Pattern{Action} file
awk没有指定分隔符的情况下,以空格作为分隔符,以换行符为标准逐行处理
举例:
使用awk '{print $1,$2,$4}' test.txt
原因是逐行执行,第一行没有$4,第二行有
awk变量分为自定义变量和内置变量
内置变量
$0 整行 整行输出可以使用print $0 或者直接print
$NF 最后一个字段
NF 域个数
FS 分隔符
OFS 输出分隔符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
实例:
通过NR和NF获取文件中的行号和域个数
awk -F ":" '{print NR,NF}' /etc/passwd
需要注意的是awk中不管内置变量还是自定义变量都不使用$符号($0,$1……除外)
处理多个文件时分别显示行号
awk -F ":" '{print FNR,$0}' /etc/passwd test.txt
改变默认的行分隔符,默认为空格
awk -v RS=" " '{print NR,$0}' test.txt
默认awk输出换行是回车,ORS可以指定输出换行
awk -v ORS="---" '{print NR,$0}' test.txt
如果指定RS和ORS会是什么效果
awk -v RS=" " -v ORS="---" '{print NR,$0}' test.txt
原因是RS指定了空格换行,加上ORS指定了输出是---换行就是这个结果
ARGV和ARGC
awk 'BEGIN{print ARGV[1]}{print NR,$0}' test.txt /etc/passwd
ARGV就是将awk后面的文件名作为一个数组,ARGC代表的是文件数量
自定义变量
- -v 定义自定义变量,方法和使用内置变量一样
并且可以引用shell变量 -
program中定义,注意的是变量定义和动作需要;隔开
awk格式化输出printf使用
printf命令和动作的使用区别,awk使用printf时格式字符串和参数要用,隔开,而直接使用printf不用
printf单独使用时%s可以传入多个参数,awk结合使用时参数个数和格式符要一致awk pattern(模式或者条件)
BEGIN/END模式
空模式
关系运算模式
正则模式
awk使用正则时,是放到两个/中的
1、当在awk命令中使用正则模式时,使用到的正则用法属于"扩展正则表达式"(如果不理解,请参考博客中的"正则表达式"系列文章)。
2、当使用 {x,y} 这种次数匹配的正则表达式时,需要配合--posix选项或者--re-interval选项。
*行范围模式
注意的是关系运算符中有一个~和!~
用法如下:
BEGIN 指定处理文本之前做什么
END 指定文本处理完成后的动作
awk 'BEGIN{print "--------------"}{print $0}END{print "--------------"}' test.txt
-F 指定分隔符
-v 指定变量cat /etc/passwd|awk -F ":" -v OFS="??" ' {print $1,$2}'
awk [options] 'Pattern{Action}' file
匹配添加和动作都是在单引号内awk action(动作)
{} 和print都是动作,print是输出内容,{}是将多个域名组合成代码块的动作
awk 循环,可使用if else if else while for
跳过循环continue break
退出执行exit,跳过执行next
awk 数组,可以不申明宿主直接使用,且awk 中的数据下标对应的值可以为空吗,delete可以删除数组元素或者数组awk 内置函数
rand 生成一个0-1的随机数
srand 搭配rand使用,否则生成的随机数不会变
int
取整
sub.gsub替换文本
区别在于gsub是将配到到的字符串全部替换,sub只替换配到到的第一个字符串
length获取字符段长度
index 获取指定字符在字符串中的位置
split 切割字符串作为数组
asort将数组排序,排序后的数组下表将重置
awk三元运算符
条件?结果1:结果2