5-1-5-shell:字符串处理进阶--awk篇

处理过程: 

依次对每一行进行处理,然后输出

命令形式

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.
he 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 ac" |awk '/bb/ {print NR,$0}' 1 aa-bb
!// 纯字符不匹配 echo -e "aa-bb ac" |awk '!/bb/ {print NR,$0}' 2 ac
$i~// 字段值匹配 echo -e "aa-bb ac" |awk -F'-' '$1~/aa/ {print NR,$0}' 1 aa-bb
$i!~// 字段值不匹配 echo -e "aa-bb ac" |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 cc" |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 cc" |awk -F'-' 'BEGIN{ORS="*"} {print $0}' aa-bb*
cc*

数值运算符

+ 
-
*
/
> 
>=
==
!=

条件运算符

if (a>10) print "1" else print "0";

逻辑运算符

&& 
||
原文地址:https://www.cnblogs.com/lamp-lrh/p/14678632.html