shell awk 详细说明

作者:Rui 发布时间:December 2, 2015 分类:Linux,CLOUD 浏览:409

简介

awk是linux下一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的。awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域(段),域和域之间使用分割符分割。

内建变量

我们可以来看看awk的一些内建变量
QQ图片20160126161721.png

内建函数

print

################################
# Print 使用示例
# test.txt 测试数据内容 
#   xiaoming,1,11.0
#   lisi,2,12.0
#   chen,3,13.0
################################

# 1. 打印整行数据 $0 
awk '{print $0}' test.txt

# 2. 打印每行的最后一个字段: $NF
awk -F ',' '{print $NF}' test.txt

# 3. 打印第三个字段: $1
awk -F ',' '{print $1}' test.txt

# 4. 打印第一行数据: NR
awk 'NR==1{print $0}' test.txt

# 5. 打印最后一行数据: END
awk 'END{print $0}' test.txt

# 6. 打印每行的倒数第二个字段,并在其后打印你好
awk -F ',' '{print $(NF-1),"nihao"}' test.txt

# 7. 打印行号
awk '{print NR, $0}' test.txt

# 8. 打印当前系统环境变量的某个特定值
awk 'BEGIN{print ENVIRON["PATH"];}'

# 9. 用:分割,删除第2个字段 输出
awk 'BEGIN{FS=","; OFS=":"} {print $1, $3}' test.txt

printf

print format 生成报表
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 显示字符的ASCII码
%p 指针的值
%e 科学技术法显示数值
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g %G 以科学计数法或浮点数的格式显示数值
%% 显示其自身

修饰符:
-: 左对齐
+: 显示数值符号
N: 显示

$ awk '{printf "%-8s %-8s %-8s\n",$1,$2,$3}' test.txt 
xiaoming 1        11.0    
lisi     2        12.0    
chen     3        13.0

split

$ ADDI_GIT=<abc>:<efg>
$ echo $ADDI_GIT | awk '{split($0, a, ">:<"); print a[1]}'
abc

substr

$ ADDI_GIT=abcdfg
$ echo $ADDI_GIT | awk '{print substr($0, 3)}'
cdfg
$ echo $ADDI_GIT | awk '{print substr($0, 3, length($0)-1)}'
cdf

数学运算与逻辑运算

算数运算

+- * / %(取模(余数)) ^(幂运算)

$ awk -F ',' '{print $1, $2+$3}' test.txt
xiaoming 12
lisi 14
chen 16

关系运算符

< > == != >= <= ~(匹配) !~(不匹配)

$ awk -F ',' '$2 > 2 {print $0}' test.txt
chen,3,13.0

逻辑运算符

&& || !

$ awk -F ',' '$2 > 2 && $3 > 12 {print $0}' test.txt
chen,3,13.0

流控制和循环

条件判断

$ awk  -F ',' '{print ( $2 > $3 ? $2 : $3)}' test.txt
11.0
12.0
13.0

if-else

$ awk  -F ',' '{ if ($3 >= 13 && $2 <= 14) {print $1,"A"} else if ($3 >= 12 && $2 < 13) {print $1,"B"} else if ($3 >= 11 && $2 < 12) {print $1,"C"} else {print $1,"D"} }' test.txt
xiaoming C
lisi B
chen A

while

$ ADDI_GIT=abcdfg
$ echo $ADDI_GIT | awk -F 'c' 'END {i=1; while(i<=NF) { printf("%s\n", $i); i++ }}'
ab
dfg

for

$ ADDI_GIT=abcdfg
$ echo $ADDI_GIT | awk -F 'c' 'END {for(i=1; i<=NF; i++) printf("%s\n", $i)}'
ab
dfg

BEGIN END

BEGIN{ 动作;动作;... } 在处理文件之前,要执行的动作;只执行一次
END{ 动作;动作;... } 在处理完文件之后,要执行的动作;只执行一次
BEGIN :可以给文件添加标题、定义变量、定义文件的分隔符
END :汇总的操作
getline可以从管道和标准输入读取输入,然后传递给变量。

awk 'BEGIN{"date" | getline a} {print} END{print a}' test.txt

正则表达式

() {} 不支持
. * ^ $ ? + [] | < > () 可以直接使用

# 正则替换aaaa -> <A>
$ echo aaaabcd | awk '{ sub(/a+/, "<A>"); print }'
<A>bcd

# 正则匹配
$ echo 5asdas | awk 'BEGIN { identifier_regexp = "[A-Za-z_][A-Za-z_0-9]+" } {$0 ~ identifier_regexp print}'

# 正则匹配 用作IF条件
$ echo aB | awk '{if ($0 ~ /ab/) {print "A"} else {print "B"}}'

标签: none

添加新评论 »