Linux awk
awk
用于格式化文本,支持变量、支持循环
1、语法
awk [参数] [处理规则] [操作对象]
2、参数
-F 指定分割符,默认为空格
$NF 分割后的最后一个 字段
3、生命周期
grep sed awk 都是读一行处理一行,直到处理完成
1)接收一行作为输入
2)把读入的内容进行分解
3)使用处理规则进行处理
4)输入一行赋值给$0,直到处理完成($0代表当前行的内容)
5)把处理完后的所有数据,交给END{}来再次处理
4、预定义变量
$0 当前行
$n 第n列
NF 当前行分割的段数
NR 当前的等号(不是文本内部的行号)
FS 指定分割符 相当于-F ,优先级高于-F
awk 'BEGIN{FS=";"}{print $NF}'
OFS 指定打印分隔符(默认空格)
awk 'BEGIN{OFS=">>>"}{print $NF,$1}'
5、处理规则的执行流程
BEGIN{} 定义变量
// 正则
{} 循环
END{}
6、函数
print 打印
printf 格式化输出
%s 字符串
%d 数字
- 左对齐
+ 右对齐
15 至少占用15个字符
7、定位
1)正则表达式
正则规划写在//中间,awk -F: '/^root/{print $0}' /etc/passwd
2)比较表达式
> >= < <=
~ 正则匹配 包含
!~ 正则匹配 不包含
用户id大于组id awk -F: '$4>$3{print $0}' /etc/passwd
结尾包含bash awk -F: '$NF ~ /bash/ {print $0}' /etc/passwd, !~ 表示不包含
3)逻辑表达式
&& || !
4)算术表达式
+ - * / %
awk -F: '$3 + $4 > 2000{print $0}'
5)条件表达式
== > < >= <=
awk -F: 'NR == 3{print $0}' /etc/passwd
6)范围表达式
从以root开头的行,到ftp开头的行: awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
8、流程控制
只存在于循环之中
if 三种结构: if(){} if(){}else{} if(){}else if(){}else{}
awk -F: '{if ( $3 > $4 ) {print "大于"} else {print "小于"}'
for
for (i=;;;){}
awk -F: '{for (i= 10;i>0;i--){print $0}}' /etc/passwd
while
while(){}
awk -F: '{i= 1;while(i<10){print $0,i++}'} /etc/passwd
第隔5行打印-------------
awk -F: '{if (NR%5==0) {print '---------------' } print $0}' /etc/passwd
浙公网安备 33010602011771号