awk
语法结构
awk 选项 ‘命令部分’ 文件名
awk 选项 ‘BEGIN{开始处理之前};{处理中};END{处理结束后}’ 文件名
内部相关变量
$0 当前处理行的所有记录
$1,$2,$3 … $n 文件中每行以间隔符号分割的不同字段
NF 当前记录的字段数(列数)
$NF 最后一列
FNR/NR 行号
FS 定义间隔符
OFS 定义输出字段分隔符,默认空格
RS 输入记录分割符,默认换行
ORS 输出记录分割符,默认换行
测试命令
cp /etc/passwd passwd 数据准备
输出passwd 中按照:分割的行号,第一列,倒数第二列,最后一列,总列数
awk -F: '{print NR,$1,$(NF-1),$NF,NF}' passwd ;
awk 'BEGIN{FS=":";OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' passwd
awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' passwd
awk格式化
awk -F: 'BEGIN{ printf "%-15s %-15s\n","姓名","年龄"};/root/{printf "%-15s %-15s\n", $NF,$(NF-1)};END{print "************************"}' passw
%s 字符类型 strings %-20s
%d 数值类型
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
awk变量
awk -v num=1 'BEGIN{print num}'
流程控制语句
if …
awk -F: ‘{if($3>=500 && $3<=60000) {print $1,$3} }’ passwd
if…else语句:
awk -F: ‘{ if($3>=500 && $3 != 65534) {print $1"是普通用户"} else {print $1,“不是普通用户”}}’ passwd
if…else if…else语句:
awk -F: ‘{if($30) {print $1,“is admin”} else if($3>=1 && $3<=499 ||$365534) {print $1,“is sys users”} else {print $1,“is general user”} }’ a.txt
for循环
awk ‘BEGIN { for(i=1;i<=5;i++) {print i} }’
awk ‘BEGIN { i=1;while(i<=5) {print i;i++} }’