积少成多

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

可以对列和行进行操作,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)

 

posted on 2016-05-18 22:23  x7b5g  阅读(299)  评论(0编辑  收藏  举报