linux中的awk命令
学习啦在线学习网linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
学习啦在线学习网 awk [选项参数] 'script' var=value file(s)
或
学习啦在线学习网 awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print class="main">
linux中的awk命令
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n", class="main">
linux中的awk命令
学习啦在线学习网 ---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
学习啦在线学习网 # 使用","分割
$ awk -F, '{print class="main">
linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
学习啦在线学习网 awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
用法二:
学习啦在线学习网 awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange apple
学习啦在线学习网 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
学习啦在线学习网 3 Are awk
This's a
10 There apple
用法三:
学习啦在线学习网 awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
学习啦在线学习网 $ 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
用法四:
学习啦在线学习网 awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
学习啦在线学习网 log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
学习啦在线学习网 1 1 2 this is
学习啦在线学习网 2 2 3 Are you
学习啦在线学习网 3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
学习啦在线学习网 3 $ Are $ awk
学习啦在线学习网 This's $ a $
学习啦在线学习网 10 $ There $
学习啦在线学习网 使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
学习啦在线学习网 ~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
学习啦在线学习网 This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
学习啦在线学习网 假设有这么一个文件(学生成绩表):
$ 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脚本如下:
$ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
}' log.txt学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print class="main">
linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
学习啦在线学习网 awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
学习啦在线学习网 awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
学习啦在线学习网 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
学习啦在线学习网 # 使用","分割
$ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
学习啦在线学习网 3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
学习啦在线学习网 log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
学习啦在线学习网 3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 $ this $ test
3 $ Are $ awk
This's $ a $
学习啦在线学习网 10 $ There $
学习啦在线学习网 使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
学习啦在线学习网 ~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
学习啦在线学习网 关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
学习啦在线学习网 $ 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脚本如下:
$ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
}' log.txt学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print class="main">
linux中的awk命令
Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
学习啦在线学习网 log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
学习啦在线学习网 $ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange apple
# 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
学习啦在线学习网 2 this test
3 Are awk
学习啦在线学习网 This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
$ 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
用法四:
学习啦在线学习网 awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange,apple,mongo
过滤第一列等于2的行
学习啦在线学习网 $ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
1 1 2 this is
学习啦在线学习网 2 2 3 Are you
3 3 This's a test
学习啦在线学习网 4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 $ this $ test
学习啦在线学习网 3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
学习啦在线学习网 假设有这么一个文件(学生成绩表):
$ 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脚本如下:
$ cat cal.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
}
学习啦在线学习网 我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print class="main">
linux中的awk命令
linux中的awk命令
学习啦在线学习网 ---------------------------------------------
2 3
3 4
This's 1
10 11
$ awk -va=1 -vb=s '{print class="main">
linux中的awk命令
linux中的awk命令
linux中的awk命令
---------------------------------------------
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s
用法四:
学习啦在线学习网 awk -f {awk脚本} {文件名}
实例:
学习啦在线学习网 $ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk ' class="main">
linux中的awk命令
#输出
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
学习啦在线学习网 过滤第一列等于2的行
$ awk ' class="main">
linux中的awk命令
linux中的awk命令
linux中的awk命令
Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
学习啦在线学习网 -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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
学习啦在线学习网 awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange apple
学习啦在线学习网 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this test
学习啦在线学习网 3 Are awk
This's a
10 There apple
用法三:
学习啦在线学习网 awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
学习啦在线学习网 过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
学习啦在线学习网 过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
学习啦在线学习网 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
学习啦在线学习网 2 2 3 Are you
学习啦在线学习网 3 3 This's a test
学习啦在线学习网 4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
2 $ this $ test
学习啦在线学习网 3 $ Are $ awk
This's $ a $
10 $ There $
学习啦在线学习网 使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
学习啦在线学习网 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
学习啦在线学习网 ~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
学习啦在线学习网 ---------------------------------------------
3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
学习啦在线学习网 假设有这么一个文件(学生成绩表):
$ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
=="Are" {print class="main">linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
学习啦在线学习网 log.txt文本内容如下:
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this test
学习啦在线学习网 3 Are awk
This's a
10 There apple
用法三:
学习啦在线学习网 awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
学习啦在线学习网 $ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
学习啦在线学习网 $ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
学习啦在线学习网 log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
学习啦在线学习网 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 1 1 2 this is
学习啦在线学习网 2 2 3 Are you
3 3 This's a test
学习啦在线学习网 4 4 10 There are
学习啦在线学习网 # 指定输出分割符
学习啦在线学习网 $ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
学习啦在线学习网 2 $ this $ test
3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
学习啦在线学习网 ~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
学习啦在线学习网 关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
学习啦在线学习网 假设有这么一个文件(学生成绩表):
$ 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脚本如下:
$ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt #命令#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
学习啦在线学习网 log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR, class="main">
linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
学习啦在线学习网 awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
学习啦在线学习网 -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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
学习啦在线学习网 3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
学习啦在线学习网 ---------------------------------------------
2 3
3 4
This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
学习啦在线学习网 $ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
学习啦在线学习网 $ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
学习啦在线学习网 3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
学习啦在线学习网 log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
学习啦在线学习网 log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
学习啦在线学习网 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 1 1 2 this is
2 2 3 Are you
3 3 This's a test
学习啦在线学习网 4 4 10 There are
学习啦在线学习网 # 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $
学习啦在线学习网 使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
学习啦在线学习网 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
学习啦在线学习网 关于awk脚本,我们需要注意两个关键词BEGIN和END。
学习啦在线学习网 BEGIN{ 这里面放的是执行前的语句 }
学习啦在线学习网 END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
学习啦在线学习网 假设有这么一个文件(学生成绩表):
$ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
学习啦在线学习网 # 指定输出分割符
$ awk '{print class="main">
linux中的awk命令
Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
学习啦在线学习网 awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
学习啦在线学习网 -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报告信息的版本。
linux的awk命令的基本用法
学习啦在线学习网 log.txt文本内容如下:
学习啦在线学习网 2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this test
学习啦在线学习网 3 Are awk
学习啦在线学习网 This's a
学习啦在线学习网 10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
学习啦在线学习网 $ 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
用法四:
学习啦在线学习网 awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
过滤第一列等于2的行
学习啦在线学习网 $ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
学习啦在线学习网 3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
学习啦在线学习网 # 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $
学习啦在线学习网 使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
学习啦在线学习网 ~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
学习啦在线学习网 3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' OFS=" $ " log.txt---------------------------------------------
学习啦在线学习网 2 $ this $ test
学习啦在线学习网 3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
$ awk '
linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
用法二:
学习啦在线学习网 awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
学习啦在线学习网 $ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange apple
# 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
学习啦在线学习网 $ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
学习啦在线学习网 $ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange,apple,mongo
过滤第一列等于2的行
学习啦在线学习网 $ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
学习啦在线学习网 log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
学习啦在线学习网 3 3 This's a test
学习啦在线学习网 4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
学习啦在线学习网 2 $ this $ test
3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
学习啦在线学习网 使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
学习啦在线学习网 END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
学习啦在线学习网 我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
学习啦在线学习网 AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
~ /th/ {printlinux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
学习啦在线学习网 awk [选项参数] 'script' var=value file(s)
或
学习啦在线学习网 awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
学习啦在线学习网 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
学习啦在线学习网 10 orange,apple,mongo
用法二:
学习啦在线学习网 awk -F #-F相当于内置变量FS, 指定分割字符
实例:
学习啦在线学习网 # 使用","分割
学习啦在线学习网 $ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
学习啦在线学习网 This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
学习啦在线学习网 ---------------------------------------------
2 3
3 4
This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
学习啦在线学习网 过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
学习啦在线学习网 log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
学习啦在线学习网 1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
学习啦在线学习网 # 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 $ this $ test
学习啦在线学习网 3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
学习啦在线学习网 This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
学习啦在线学习网 There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
学习啦在线学习网 END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
学习啦在线学习网 $ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
This's a test
模式取反
$ awk '
linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
学习啦在线学习网 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
学习啦在线学习网 log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
学习啦在线学习网 # 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
# 格式化输出
学习啦在线学习网 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
学习啦在线学习网 # 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
学习啦在线学习网 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
学习啦在线学习网 $ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
过滤第一列等于2的行
学习啦在线学习网 $ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
学习啦在线学习网 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
学习啦在线学习网 1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
学习啦在线学习网 # 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
学习啦在线学习网 2 $ this $ test
3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
学习啦在线学习网 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
学习啦在线学习网 ---------------------------------------------
3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
学习啦在线学习网 $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
学习啦在线学习网 This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
学习啦在线学习网 BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
学习啦在线学习网 {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
学习啦在线学习网 $ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
学习啦在线学习网 我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
学习啦在线学习网 AWK的hello world程序为:
BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
学习啦在线学习网 seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
!~ /th/ {print学习啦在线学习网linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
学习啦在线学习网 awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
学习啦在线学习网 -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报告信息的版本。
linux的awk命令的基本用法
学习啦在线学习网 log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
学习啦在线学习网 10 orange,apple,mongo
# 格式化输出
学习啦在线学习网 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
学习啦在线学习网 # 使用","分割
$ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange apple
学习啦在线学习网 # 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 2 this test
3 Are awk
This's a
学习啦在线学习网 10 There apple
用法三:
awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
学习啦在线学习网 $ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
学习啦在线学习网 过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo
学习啦在线学习网 过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
学习啦在线学习网 过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
学习啦在线学习网 3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
学习啦在线学习网 log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
学习啦在线学习网 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
学习啦在线学习网 log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
学习啦在线学习网 $ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
学习啦在线学习网 3 3 This's a test
学习啦在线学习网 4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
学习啦在线学习网 2 $ this $ test
3 $ Are $ awk
学习啦在线学习网 This's $ a $
10 $ There $
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
学习啦在线学习网 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 Are like
a
学习啦在线学习网 There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
学习啦在线学习网 {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ 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脚本如下:
学习啦在线学习网 $ cat cal.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
}
我们来看一下执行结果:
学习啦在线学习网 $ awk -f cal.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
另外一些实例
AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
学习啦在线学习网 seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
$ awk '!/th/ {print
学习啦在线学习网linux中的awk命令
学习啦在线学习网 Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
学习啦在线学习网 2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
# 格式化输出
学习啦在线学习网 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
用法二:
学习啦在线学习网 awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
学习啦在线学习网 $ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
10 There are orange apple
# 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
学习啦在线学习网 3 Are awk
This's a
学习啦在线学习网 10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
学习啦在线学习网 $ 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
用法四:
学习啦在线学习网 awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
学习啦在线学习网 过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
学习啦在线学习网 3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
学习啦在线学习网 log.txt 2 3 3 3
学习啦在线学习网 log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
学习啦在线学习网 log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
1 1 2 this is
学习啦在线学习网 2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
学习啦在线学习网 $ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
2 $ this $ test
3 $ Are $ awk
学习啦在线学习网 This's $ a $
学习啦在线学习网 10 $ There $
学习啦在线学习网 使用正则,字符串匹配
学习啦在线学习网 # 输出第二列包含 "th",并打印第二列与第四列
学习啦在线学习网 $ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
学习啦在线学习网 ---------------------------------------------
学习啦在线学习网 3 Are you like awk
学习啦在线学习网 10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
学习啦在线学习网 This's a test
模式取反
学习啦在线学习网 $ awk '$2 !~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
学习啦在线学习网 $ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
学习啦在线学习网 There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
学习啦在线学习网 $ 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脚本如下:
$ cat cal.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
}
学习啦在线学习网 我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
,}' log.txt---------------------------------------------
学习啦在线学习网 Are like
a
There orange,apple,mongo
awk脚本
学习啦在线学习网 关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
学习啦在线学习网 END {这里面放的是处理完所有的行后要执行的语句 }
学习啦在线学习网 {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ 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脚本如下:
$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
学习啦在线学习网 math = 0
学习啦在线学习网 english = 0
学习啦在线学习网 computer = 0
学习啦在线学习网 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
学习啦在线学习网 printf "---------------------------------------------\n"
}
#运行中
{
math+=
english+=
computer+=
printf "%-6s %-6s %4d %8d %8d %8d\n", class="main">
linux中的awk命令
Linux中的awk是一种处理文本文件的语言,下面由学习啦小编为大家整理了linux的awk命令的相关知识,希望对大家有帮助!
linux中的awk命令详解
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
学习啦在线学习网 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
学习啦在线学习网 -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报告信息的版本。
linux的awk命令的基本用法
log.txt文本内容如下:
2 this is a test
学习啦在线学习网 3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
学习啦在线学习网 $ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
学习啦在线学习网 This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
学习啦在线学习网 $ awk -F, '{print $1,$2}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this is a test
3 Are you like awk
学习啦在线学习网 This's a test
学习啦在线学习网 10 There are orange apple
# 或者使用内建变量
学习啦在线学习网 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
学习啦在线学习网 2 this is a test
3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
学习啦在线学习网 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
学习啦在线学习网 ---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
学习啦在线学习网 $ awk -va=1 '{print $1,$1+a}' log.txt
学习啦在线学习网 ---------------------------------------------
2 3
3 4
学习啦在线学习网 This's 1
10 11
$ 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
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
学习啦在线学习网 $ awk '$1>2' log.txt #命令
#输出
学习啦在线学习网 3 Are you like awk
This's a test
学习啦在线学习网 10 There are orange,apple,mongo
过滤第一列等于2的行
学习啦在线学习网 $ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于'Are'的行
学习啦在线学习网 $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
内建变量
变量 | 描述 |
---|---|
\$n | 当前记录的第n个字段,字段间由FS分隔 |
\$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 输入字段分割符 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
学习啦在线学习网 $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
学习啦在线学习网 ---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
学习啦在线学习网 FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
学习啦在线学习网 log.txt 2 1 ' 1 1
学习啦在线学习网 log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
学习啦在线学习网 # 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
学习啦在线学习网 ---------------------------------------------
1 1 2 this is
学习啦在线学习网 2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
学习啦在线学习网 ---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
学习啦在线学习网 10 $ There $
学习啦在线学习网 使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
学习啦在线学习网 # 输出包含"re" 的行
学习啦在线学习网 $ awk '/re/ ' log.txt
学习啦在线学习网 ---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
学习啦在线学习网 Are like
a
学习啦在线学习网 There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
学习啦在线学习网 ---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
学习啦在线学习网 END {这里面放的是处理完所有的行后要执行的语句 }
学习啦在线学习网 {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ 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脚本如下:
$ cat cal.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
}
我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
学习啦在线学习网 AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581
学习啦在线学习网 从文件中找出长度大于80的行
awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
, ,,, ++}
#运行后
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
}
学习啦在线学习网 我们来看一下执行结果:
$ awk -f cal.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
另外一些实例
学习啦在线学习网 AWK的hello world程序为:
学习啦在线学习网 BEGIN { print "Hello, world!" }
计算文件大小
学习啦在线学习网 $ ls -l *.txt | awk '{sum+=} END {print sum}'
学习啦在线学习网 --------------------------------------------------
666581
从文件中找出长度大于80的行
学习啦在线学习网 awk 'lenght>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'