一,基本语法
awk基本语法
awk ‘script’ files
awk '{pattern + action}' 或者 awk 'pattern {action}'
二,变量
在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义。变量的类型可以是数字、字符串。根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文。下面为变量的赋值负号列表:
符号 | 含义 | 等价形式 |
= | a = 5 | a = 5 |
+= | a = a + 5 | a += 5 |
-= | a = a - 5 | a -= 5 |
*= | a = a * 5 | a *= 5 |
/= | a = a / 5 | a /= 5 |
%= | a = a % 5 | a %= 5 |
^= | a = a ^ 5 | a ^= 5 |
变量名 | 变量内容 |
ARGC | 命令行参数的数量。 |
ARGIND | 命令行正在处理的当前文件的AGV的索引。 |
ARGV | 命令行参数数组。 |
CONVFMT | 转换数字格式。 |
ENVIRON | 从shell中传递来的包含当前环境变量的数组。 |
ERRNO | 当使用close函数或者通过getline函数读取的时候,发生的重新定向错误的描述信息就保存在这个变量中。 |
FIELDWIDTHS | 在对记录进行固定域宽的分割时,可以替代FS的分隔符的列表。 |
FILENAME | 当前的输入文件名。 |
FNR | 当前文件的记录号。 |
FS | 输入分隔符,默认是空格。 |
IGNORECASE | 在正则表达式和字符串操作中关闭大小写敏感。 |
NF | 当前文件域的数量。 |
NR | 当前文件记录数。 |
OFMT | 数字输出格式。 |
OFS | 输出域分隔符。 |
ORS | 输出记录分隔符。 |
RLENGTH | 通过match函数匹配的字符串的长度。 |
RS | 输入记录分隔符。 |
RSTART | 通过match函数匹配的字符串的偏移量。 |
SUBSEP | 下标分隔符。 |
三:awk规定引用外部变量必须使用单引号加双引号,即'"$sysvar"'这样的格式,但是split函数也需要双引号来定界,但这个双引号又不能让sh解释,而应留给awk来解释,所以使用了\"和\"组成的双引号
name="76868&5676&435&43526&334&12312312&12321"
awk 'BEGIN {print split(('"\"$name\""', filearray, "&")}'
注意与下面的区别:
awk 'BEGIN {name="76868&5676&435&43526&334&12312312&12321"; print split(name, filearray, "&") ;print filearray[1]}'
四,字符串连接操作
将几个字符串连接起来使用"";如果使用+号,会自动转换为数值。
例如:awk 'BEGIN{a=100;b=200;c=(a""b);print c}'
输出:100200
如果是这样:awk 'BEGIN{a=100;b=200;c=(a+b);print c}'
输出:300
再如:awk 'BEGIN{a="a";b="bb";c=(a+b);print c}'
输出:0
五,重定向
在 动作语句中使用shell通用的重定向输出符号">"就可以完成awk的重定向操作
awk '$4 >= 70 {print $1,$2 > "passing_file"}' filename #注意这里的文件名需要用双引号括起来。
awk中对于输入重定向是通过getline函数来完成的。getline函数的作用是从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得 输入。
语法:awk 'BEGIN { "command" | getline d; print d}'
对于command中,对于局部变量要使用加双引用,对于命令本身中要加双引号的地方改成\" \"。
例如:cat /etc/shadow | awk 'BEGIN {FS=":";ta="19700101 +"};{tc=ta""$3" days"; "date --date=\""tc"\" +%Y%m%d" | getline bb} ; {print $1,$2,bb}'
再如:head -n4 /etc/shadow | awk 'BEGIN {FS=":";OFS="\t"};{"date --date=\"19700101 +"$3" days\" +%Y%m%d" | getline expir};{print $1,$2,expir}'
date --date="string" 对于此命令来说,如果string中有空格,那必须加双引号。为此,对于输入重定向 动作中上,就应把里面的双引号改为\",并且对于里面用到的变量加上双引号"$3"或"tc"
参考:
http://www.cnblogs.com/mchina/archive/2012/06/30/2571317.html
http://blog.sina.com.cn/s/blog_4d1f40c00100r7y3.html