linux:awk命令

awk概述:

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,
 或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,
 是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

   awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,
并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),
如果没有指定模式,则所有被操作所指定的行都被处理。

   相较于sed 常常作用于一整个行的处理,awk 则比较倾向于一行当中分成数个『字段』来处理。 
因此,awk 相当的适合处理小型的数据数据处理。

语法形式

awk [options] 'script' var=value file(s) 
awk [options] -f scriptfile var=value file(s)

常用命令选项

-F fs    fs指定输入分隔符,fs可以实字符串或者正则表达式,如 -F :
-v var=value   赋值一个用户定义变量,将外部变量传递给awk。
-f scripfile   从脚本文件转中读取awk命令。

awk脚本是由模式和操作组成的

模式可以是以下任意一个: 
•/正则表达式/:使用通配符的扩展集。
•关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串 或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
•模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
•模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
•BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在 这里设置全局变量。
•END:让用户在最后一条输入记录被读取之后发生的动作。

操作:
操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开, 并位于大括号内。主要有四部份:
•变量或数组赋值 
•输出命令 
•内置函数 
•控制流命令

awk脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end"}' file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、
END语句块3部分组成,这三个部分是可选的。任意一 个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中。

awk内置变量(预定义变量)

$n  当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字 段。 
$0  这个变量包含执行过程中当前行的文本内容。 
FNR 同NR,但相对于当前文件。 
FS  字段分隔符(默认是任何空格) 
NF  表示字段数,在执行过程中对应于当前的字段数 
NR  表示记录数,在执行过程中对应于当前的行号 
OFS 输出字段分隔符(默认值是一个空格) 
RS  记录分隔符(默认是一个换行符) 
ORS 输出记录分隔符(默认值是一个换行符)

实例:

#打印每一行的第二和第三个字段:
awk '{ print $1,$3 }' file

#统计文件中的行数
awk 'END{ print NR }' file

#借助-v选项,可以将外部值(并非来自stdin)传递给awk
var=100
echo | awk -v variable=$var '{ print variable }'
#另一种传递外部变量的方法
var1="abc"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

awk运算与判断

例:
awk 'BEGIN{a=1,b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0  1

#正则运算符
awk 'BEGIN{a="100test";if(a ~ /^100*/){print "ok";}}'
ok
#关系运算符
awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'
ok

#输出到一个文件
echo | awk '{printf("hello word") > "datafile"}'
#-F 设置字段定界符(分隔符)
awk -F : '{print $NF }' /etc/passwd
或
awk 'BEGIN{ FS=":"}{ print $NF }' /etc/passwd

数组的定义

#数字做数组索引
Array[1]="sun"
#字符串做数组索引
Array["first"]="name"
#读取数组的值
{for(item in array){print array[item]};} #输出的顺序是随机的
{for(i=1;i<=len;i++){print array[i]};} #len是数组长度

猜你喜欢

转载自blog.csdn.net/wxc_qlu/article/details/82561821