可以对列和行进行操作,awk有很多内建功能,比如数组,函数等。
结构:
#########################################################################
# File Name: awk.sh
# Author: lizhen
# mail: lizhen_ok@163.com
# Created Time: Wed 18 May 2016 09:48:10 PM CST
#########################################################################
#!/bin/bash
awk '
BEGIN{
i=0
}
{
i++
}
END{
print i
}
' n
echo $?
awk由3部分构成,begin,end和带模式匹配选项常见语句块。注意这三部分都是被包含在单引号‘ ’或双引号“ ”之间的。
============
执行步骤:
1,执行BEGIN {commands}语句块中的语句
2,从文件或stdin中读取一行,然后执行pattern {commands},重复这个过程,直到文件全部读取完毕
3,到读到输入流末尾时,执行END {commands}语句块
BEGIN语句块和END语句块都是可选的,BEGIN语句块在开始从输入流中读取行之前执行,常做的工作由变量初始化,打印输出表格等等
END语句块是在从输入流读取完所有的行之后即被执行的行,通常做些扫尾工作。
pattern语句块,可选。如果没有这个语句块,默认是{print },就是打印读取到的一行;awk对于每一行,都会执行这个语句块,就像一个读取行的while循环,在循环体提供了相应的语句。
print语句:当不带参数时,打印输出当前行
当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符
在print语句中,双引号是被当作拼接符号使用的。
[lizhen@dhcp-128-93 shell]$ echo | awk '{var1="v1";var2="v2"; print var1,var2}' v1 v2 [lizhen@dhcp-128-93 shell]$ echo | awk '{var1="v1";var2="v2"; print var1 "-" var2}' v1-v2 [lizhen@dhcp-128-93 shell]$
===========
特殊变量
NR 当前的记录数量,就是执行过程当前行号
NF 字段数量,对应于当前行的字段数量
$0 这个变量包含执行过程中当前行的文本内容副本
$1 第一个字段的文本内容
$2 第二个字段的文本内容3
awk中printf()函数的语法与c语言中的同名函数一样,可以代替print
=====
将外部变量值传递给awk,使用-v选项
[lizhen@dhcp-128-93 shell]$ var=1000 [lizhen@dhcp-128-93 shell]$ echo | awk -v VAR=$var '{print VAR}' 1000 [lizhen@dhcp-128-93 shell]$
或者利用 从文件读取的思路:如下
[lizhen@dhcp-128-93 shell]$ var1="var1111";var2="var2222" [lizhen@dhcp-128-93 shell]$ echo | awk '{print v1,v2}' v1=$var1 v2=$var2 var1111 var2222 [lizhen@dhcp-128-93 shell]$
3,使用getline读取行,getline var ##var包含特定行的内容
awk默认读取一个文件的所有行,如果只想读取某一行,可以使用getline函数
有时候我们需要在BEGIN语句块中读取第一行
[lizhen@dhcp-128-93 shell]$ seq 5 | awk 'BEGIN {getline; print "read ahead first line", $0} {print $0}' read ahead first line 1 2 3 4 5 [lizhen@dhcp-128-93 shell]$
4,使用过滤模式对awk处理行进行过滤
8,最重要的就是awk内建的字符串控制函数了
length(string)
index(string,search_string)
split(string,array,delimiter)
substr(string,start-position,end-position)
sub(regex,replacement_str,string_
gsub(regex,replacement_str,string)
match(regex,string)