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