处理过程:
依次对每一行进行处理,然后输出
命令形式
awk 参数 命令 文件 awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}‘ file
参数列表 [-F | -f | -v]
-F 指定分隔符 -f 指定使用脚本文件 -v 定义变量
DEMO:
-F demo
echo "aa bb cc" | awk -F" " ‘{print $2,$1,$3}‘ 结果:"bb aa cc"
echo -e "aa-bb#cc" |awk -F‘[- #]‘ ‘{for (i=1;i<=NF;i++) print i" "$i;}‘ 结果: " 1 aa 2 bb 3 cc "
-f demo
command.file: {print $2,$1,$3} echo "aa bb cc" | awk -F" " -f command.file 结果:"bb aa cc"
-v demo
echo "aa bb cc" | awk -F" " -v"a=22" ‘{print $2,a,$3}‘ 结果:bb 22 cc
命令详解
符号标识
‘‘ 整个命令区间标识,双单引号包含区间 {} 代码块区间标识,命令代码块,包含一条或多条命令 ; 代码间分割标识,多条命令使用分号分隔
echo "this is a test" |awk -F" " ‘{print $2; print $1;}‘
代码起始标识符
BEGIN 后续跟代码块{},初始化代码,每一行处理前置,主要是引用全局变量,设置FS分隔符 // 后续跟代码块{},匹配代码块,每一行处理过程,可以是字符串或正则表达式 END 后续跟代码块{},结尾代码块,所有行处理后置,再执行的代码块,主要是进行最终计算或输出结尾摘要信息
起始代码块
echo -e "this is a test.\nhe is a boy." |awk -F" " ‘BEGIN{a="start--"} {print a" "$0" ";} END{print "--end."}‘ 结果: " start-- this is a test. start-- he is a boy. --end. "
匹配代码块
符号 | 含义 | 样例 | 结果 |
// | 纯字符匹配 | echo -e "aa-bb\nac" |awk ‘/bb/ {print NR,$0}‘ | 1 aa-bb |
!// | 纯字符不匹配 | echo -e "aa-bb\nac" |awk ‘!/bb/ {print NR,$0}‘ | 2 ac |
$i~// | 字段值匹配 | echo -e "aa-bb\nac" |awk -F‘-‘ ‘$1~/aa/ {print NR,$0}‘ | 1 aa-bb |
$i!~// | 字段值不匹配 | echo -e "aa-bb\nac" |awk -F‘-‘ ‘$1!~/aa/ {print NR,$0}‘ | 2 ac |
命令内符号详情
特殊符号变量
符号 | 含义 | 样例 | 结果 |
$0 | 整行数据 | echo -e "aa-bb#cc" |awk -F‘[- #]‘ ‘{print $0}‘ | aa-bb#cc |
$1,$2 | 分割后第一个元素,第二个元素.. | echo -e "aa-bb#cc" |awk -F‘[- #]‘ ‘{print $1, $2}‘ | aa bb |
NF | 分割后元素个数 | echo -e "aa-bb#cc" |awk -F‘[- #]‘ ‘{print NF}‘ | 3 |
NR | 每一行行号,多文件行号递增 | echo -e "aa-bb\ncc" |awk -F‘[- #]‘ ‘{print NR, $0}‘ | 1 aa-bb 2 cc |
FNR | 每一行行号,多文件行号不递增 | ||
FS | BEGIN内定义,解析一行是,输入分割符号 | echo -e "aa-bb#cc" |awk ‘BEGIN{FS="[-#]"} {print $1, $2}‘ | aa bb |
RS | BEGIN内定义,文件内输入一条记录分隔符号,默认为换行符 | echo -e "aa-bb#cc" |awk ‘BEGIN{RS="[#-]"} {print $0}‘ | aa bb cc |
OFS | BEGIN内定义,解析一行是,输出分割符号 | echo -e "aa-bb#cc" |awk -F‘[-#]‘ ‘BEGIN{OFS="*"} {print $1,$2,$3}‘ | aa*bb*cc |
ORS | BEGIN内定义,文件内输出一条记录分隔符号,默认为换行符 | echo -e "aa-bb\ncc" |awk -F‘-‘ ‘BEGIN{ORS="*"} {print $0}‘ | aa-bb* cc* |
数值运算符
+
-
*
/
>
>=
==
!=
条件运算符
if (a>10) print "1" else print "0";
逻辑运算符
&& ||