##awk language 1
####Getting Started 开始使用第一条awk命令
假设你有如下几行数据(name, salary, wordHour),默认是以空格分割字段的(后续会讲学习分隔符-F),现在希望打印出工作时长大于0的所有人。
![这里写图片描述](https://img-blog.csdn.net/20180826091911855?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
执行 awk ’ $3 > 0 { print $0 } ’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826091934326?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
好了,你已经学会了第一条awk命令,并得到自己想要的东西。
####The Structure of an AWK Program
这个命令是按行读取文件,一行一行的读,逐行读取并匹配自定义的pattern。
awk命令可以包含多个patter-action。
下面举几个例子:
- ‘$3==0 {print $0}’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826092018623?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 2. '\$3==0' uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826092029273?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 3. ‘\{print $0}’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826092049665?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
例子2和3说明有时好模式和行为会缺失,但是不影响结果的输出。
- ‘{last=$0} END{print last }’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826092108481?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
这就是多个patter-action 。
小结:
引号之内的语句就是完整的awk程序. awk语句包含模式(pattern,即匹配条件)、行为(action,就是匹配完成后动作)、然后就是输入文件。一般的awk 命令包含这几个部分,但也有其他变形,后续会提到。‘{}’ 大括号内的是action行为 ; ‘’ 引号内的不在’’{}’ 是模式。
####Running an AWK Program
- 基本语法(完整的结构)
![这里写图片描述](https://img-blog.csdn.net/20180826092140318?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
awk ‘{print $0}’ uniq.txt uniq.txt_1
![这里写图片描述](https://img-blog.csdn.net/201808260922050?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
【注意】最后一个参数是一个files ,意思就是可以多个文件为输入
2. 其他输入
![这里写图片描述](https://img-blog.csdn.net/20180826092410978?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![这里写图片描述](https://img-blog.csdn.net/2018082609514793?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
【注意】In this case awk will apply the program to whatever you type next on your terminal until you type an end-of-file signal. 此时输入就是从控制台输入数据
- 执行一个文件中的命令
![这里写图片描述](https://img-blog.csdn.net/20180826092436651?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
The -f option instructs awk to fetch the program from the named file. Any filename can be used in place of progfile.
####Simple Output
-
打印没一行
{print } 或者 {print $0}
-
打印制定的列
{print $1 , $3}
-
NF, the Number of Fields.
Awk counts the number of fields in the current input line and stores the count in a built-in vari- able called NF.
![这里写图片描述](https://img-blog.csdn.net/20180826093248452?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 计算
{print $1, $2 * $3} - 打印每行的行号
- awk ‘{print NR, $0}’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826093455724?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
####Fancier Output
- 字符串拼接
![这里写图片描述](https://img-blog.csdn.net/20180826093606280?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 格式化输出
![这里写图片描述](https://img-blog.csdn.net/20180826093631495?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
{ printf(“total pay for %s is $ %.2f\n”, $1, $2*$3) } uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826093714587?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
awk ‘{ printf("’’’%d’’’:total pay for %s is $%.2f\n", NR, $1, $2)}’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826093728134?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
注意:特殊字符需要转义,如上
awk ‘{ printf("%6.2f %s\n", $2 * $3, $0) }’ uniq.txt|sort -n -k3。对第三列排序
![这里写图片描述](https://img-blog.csdn.net/20180826093752825?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
selection 条件筛选
- 基本判断 == , >, 等等
- 或 $2 >0 || $3 >1 ; 且 $1>0 && $2>0
BEGIN 和 END的用法
awk ‘BEGIN {print “name rate hours” ;print “”} {print }’ uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826093937835?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 此处说明了awk 可以执行多个pattern -action. 可以只有action 无pattern.
- print “” 是打印了一个空行;print 打印每一行
控制流语句
-
IF-ELSE
awk -f awk.log uniq.txt
-
WHILE
awk -f awk.log # 此处换行
1000 0.5 3
![这里写图片描述](https://img-blog.csdn.net/20180826094103951?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180826094135197?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 数组的使用
awk -f awk.log uniq.txt
![这里写图片描述](https://img-blog.csdn.net/20180826094156630?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180826094214110?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0YyMjkzMzg1OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)