Linux awk命令详解

1.awk命令作用
文本处理工具

2.awk语法
awk [选项参数] '{[pattern] action}' {filenames}

-F fs or –field-separator fs 
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

-v var=value or –asign var=value 
赋值一个用户定义变量。

-f scripfile or –file scriptfile 
从脚本文件中读取awk命令。

-mf nnn and -mr nnn 
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or –compat, -W traditional or –traditional 
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or –copyleft, -W copyright or –copyright 
打印简短的版权信息。

-W help or –help, -W usage or –usage 
打印全部awk选项和每个选项的简短说明。

-W lint or –lint 
打印不能向传统unix平台移植的结构的警告。

-W lint-old or –lint-old 
打印关于不能向传统unix平台移植的结构的警告。

-W posix 
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替^和^=;fflush无效。

-W re-interval or –re-inerval 
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

-W source program-text or –source program-text 
使用program-text作为源代码,可与-f命令混用。

-W version or –version 
打印bug报告信息的版本。

3.使用示例

root@iZ238ut6jbcZ:/home/shijingjing# cat log.txt                
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

1)分割字符串
awk '{[pattern] action}' {filenames}

# 每行默认是按章空格或TAB分割的,执行结果如下
root@iZ238ut6jbcZ:/home/shijingjing# awk '{print $1,$4}' log.txt
2 a
3 like
This's 
10 orange,apple,mongo

#格式化输出
root@iZ238ut6jbcZ:/home/shijingjing# awk '{printf "%-8s %-10s\n", $1,$4}' log.txt
2        a         
3        like      
This's             
10       orange,apple,mongo

2)-F自定义分隔符
awk -F #-F指定分割字符

#-F自定义分隔符
root@iZ238ut6jbcZ:/home/shijingjing# awk -F, '{print $1,$2}' log.txt
2 this
3 Are you like awk 

#使用多个分隔符
root@iZ238ut6jbcZ:/home/shijingjing# awk -F '[ ,]' '{print $1,$2}' log.txt 
2 this
3 Are

3)-v设置变量
awk -v # 设置变量

#-v设置变量
root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 '{print $1,$1+a}' log.txt
2 3
3 4
This's 1
10 11

root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 '{print $1,$(1+a)}' log.txt
2 this
3 Are
This's a
10 There

root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt   
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s

4)表达式

root@iZ238ut6jbcZ:/home/shijingjing# awk '$1>2' log.txt
3 Are you like awk
This's a test
10 There are orange,apple,mongo

root@iZ238ut6jbcZ:/home/shijingjing# awk '$1>2 && $2=="Are"' log.txt               
3 Are you like awk

4.内建变量
1)NR --顺序号

root@iZ238ut6jbcZ:/home/shijingjing# awk '{print NR,$1,$2}' log.txt          
1 2 this
2 3 Are
3 This's a
4 10 There

2)OFS --指定输出分割符

root@iZ238ut6jbcZ:/home/shijingjing# awk '{print $1,$2}' OFS=" $ " log.txt
2 $ this
3 $ Are
This's $ a
10 $ There

5.正则表达式
1)输出第二列包含"th",并打印第二列和第四列

root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 ~ /th/ {print $2,$4}' log.txt               
this a

~:模式开始
//:模式

2)输出包含"re"的行

root@iZ238ut6jbcZ:/home/shijingjing# awk '/re/' log.txt                       
3 Are you like awk
10 There are orange,apple,mongo

3)忽略大小写

root@iZ238ut6jbcZ:/home/shijingjing# awk 'BEGIN{IGNORECASE=1} /th/' log.txt    
2 this is a test
This's a test
10 There are orange,apple,mongo
root@iZ238ut6jbcZ:/home/shijingjing# awk '/th/' log.txt                    
2 this is a test

4)模式取反

root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 ~ /th/ {print $2,$4}' log.txt 
this a
root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 !~ /th/ {print $2,$4}' log.txt 
Are like
a 
There orange,apple,mongo
root@iZ238ut6jbcZ:/home/shijingjing# awk '/th/' log.txt                     
2 this is a test
root@iZ238ut6jbcZ:/home/shijingjing# awk '!/th/' log.txt
3 Are you like awk
This's a test
10 There are orange,apple,mongo

6.awk脚本
awk -f {脚本名称} {文件名称}
awk脚本主要有两个关键字BEGIN,END
BEGIN{awk语句执行前需要执行的语句}
END{awk语句执行后需要执行的语句}

root@iZ238ut6jbcZ:/home/shijingjing# cat score.txt            
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

awk脚本如下:

#!/bin/awk -f
# 运行前
BEGIN{
 math = 0
 english = 0
 computer = 0
 printf "Name  No.   Math English Computer Total\n"
 printf "---------------------------------------\n"
}
# 运行中
{
 math += $3
 english += $4
 computer += $5
 printf "%-6s %-6s %4d %8d %8d %8d\n",$1, $2, $3, $4, $5, $3+$4+$5
}
# 运行后
END{
 printf "--------------------------------------\n"
 printf "Total:%10d %8d %8d \n", math, english, computer
 printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR 
}

运行结果:

root@iZ238ut6jbcZ:/home/shijingjing# awk -f calc.awk score.txt
Name  No.   Math English Computer Total
---------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
--------------------------------------
Total:       319      393      350 
AVERAGE:     63.80    78.60    70.00

7.其他用法
1)计算文件大小

root@iZ238ut6jbcZ:/home/shijingjing# ls -l *.txt
-rw-r--r-- 1 root root  82 Jul 27 15:41 log.txt
-rw-r--r-- 1 root root 110 Jul 27 16:26 score.txt
root@iZ238ut6jbcZ:/home/shijingjing# ls -l *.txt|awk '{sum+=$5} END {print sum}'
192

2)从文件中找出长度大于20的行

root@iZ238ut6jbcZ:/home/shijingjing# awk 'length>20' log.txt
10 There are orange,apple,mongo

posted on 2018-07-27 16:51  迪米特  阅读(226)  评论(0编辑  收藏  举报

导航