awk应用

awk应用linux

1、awk格式和选项

awk [options] 'script' var=value file(s) 
awk [options] "PATTRN  {'aciton'}" file(s) 

经常使用命令选项正则表达式

-F fs   fs指定输入分隔符,fs能够是字符串或正则表达式,如-F:shell

-v var=value   赋值一个用户定义变量,将外部变量传递给awkexpress

-f scripfile  从脚本文件中读取awk命令数组

-m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。tcp

2、awk的模式(PATTERN)

  awk 'program' input-file1 input-file2url

   其中program为:spa

     pattern{action}.net

     pattern{action}命令行

(一)常见的模式类型

   一、正则表达式:格式为/regular expression/

       二、表达式:其值非0或非空字符串时知足条件,如:$1 ~/foo/ ,用运算符~(匹配)和~!(不匹配)

       三、范围:指定匹配范围,格式:awk -F '/^r/,/^m/{print $1,$2}' /etc/passwd 以r开头到m开头截止

       四、BEGIN/END:特殊模式,仅在awk命令前运行一次或结束前运行一次

       五、空模式:匹配任何数行

(二)常见的action

     一、表达式,判断表达式等

     二、控制语句(if,for等)

     三、复合语句:重定向到其余文件

     四、输入输出语句

3、awk的输出

 (一)print输出

 格式:print item1,item2 ,...

要点:

      一、各项目之间用逗号隔开,而输出时则以空白字符分隔;

      二、输出的item能够是字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会转换为字符串再输出;

      三、print命令后面的item能够省略,此时至关于 print $0;若是想输出空白行,则需使用print "";

例子:

   #awk 'BEGIN{print "how are you"}'

   awk -F: '{print $1,$2}' /etc/passwd   

分析:print中的$0表示本身,$1表示awk切分的片为第1片,$2为第2片。

(二) awk变量

  2.一、awk内置变量之记录变量

  FS:读取文档时,所使用的字段分隔符,默认为空白字符。

  OFS:打印输出时,所使用的字段分隔符,默认为空白字符。

  RS:输入文本信息时所使用的换行符,默认是"\n"

  ORS:打印输出时所使用的换行符,默认是"\n"

例子:

         awk 'BEGIN(OFS="\t")'{print $1 ,$2} /etc/passwd

  2.二、awk内置变量之数据的变量

       NR:命令所处理的记录数:若是有多个文件,这个数目会把处理的多个文件中行统一计数;

       FNR:与NR不一样的是,FNR用于记录正处理的行,是当前这一文件中总共处理的行数;

       NF:当前记录的字段个数 

       ARGV:数组,保存命令自己这个字符串;

          如:awk '{print $0}' a.txt b.txt 这个命令中,ARGV[0]保存awk,ASGV[1]保存a.txt

       ARGC: awk命令的参数个数

       FILENAME: awk命令所处理的文件名称

       ENVIRCN:当前shell环境变量及值的关联数组

          如:awk 'ENGIN{print ENVIRCN["PATH"]}'

2.三、用户自定义变量

awk容许用户自定义本身的变量在程序代码中使用,变量名规则是只能使用字母、数字和下滑线,数字不能开头。区分大小写。

2.3.1   在脚本中赋值变量

在awk中给变量赋值:

例:

awk 'BEGIN{var ="good";print var}'

2.3.2 在命令行中使用赋值变量

awk能够在"脚本"外为变量赋值,并在脚本中引用。例如:上述可改成:

awk -v var="good" 'BEGIN{print var}'

4、printf格式输出

printf命令使用格式:

printf format ,item1,item2,..

要点:

   一、printf 须要指定format(格式);

   二、format用于指定后面每一个item的输出格式;

   三、printf语句不会自动打印换行符:\n

format格式指示符(以%开头后跟一个字符):

  %c:显示字符

  %s:显示字符串

  %d,%i:十进制数

   %e,%E:科学计数法

   %f:浮点数

   %g,%G:以科学计数法的格式或浮点格式显示数值

 %u:无符号整数

   %%:显示自身

修饰符:

    N:显示宽度

    -:左对齐,默认是右对齐

    +:显示数值符号

例子:

      awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

5、输出重定向

 print items > output-file

 print items > output-file

 print items | command

特殊文件描述符:

     /dev/stdin: 标准输入

    /dev/stdout:标准输出

    /dev/stderr:错误输出

   /dev/fd/N:某特定文件描述符,如/dev/stdin 就至关于/dev/fd/0

例子:

awk -F:'{printf "%15s %i\n",$1,$2 >"/dev/sderr"}' /etc/passwd

6、awk的操做符

注意:> < 能够做为字符串比较,也能够用做数值比较,关键看操做数若是是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

7、数组

   (一)、数组的定义

            array[index-expression]

                 一、数字作数组下标

      Arr[1]="sun" 
      Arr[2]="uu"

                 二、字符串作数组下标

      Array["first"]="www" 
      Array["last"]="name" 
      Array["birth"]="1987"

  index-expression能够是任意字符串,须要注意的是若是某数据组元素事先不存在,那么在其引用时,awk会自动建立次元素并初始化为空字符串,所以要判断某数据组中使用index in array方式

要遍历数组中每个元素,须要使用以下结构:

for (var in arrar) {statement1,...}

其中 var用于引用数组下标,而不是元素值;

例子:

     netstat -ant | awk '/^tcp/ {S[$NF]++} END{for (a in S ) print a,S[a]}'

    每出现一次/^tcp/模式匹配到的行,数组S[$NS]就加1,NF为当前行的最后一个字段,此处用其值做为数组S的元素索引;

    awk '{counts[$1]++}END {for(url in counts) print counts[url],url}'  /var/log/httpd/access_log

(二)删除数组

  delete array[key]

     能够删除,对应数组key的,序列值。

例:

  awk 'BEGIN{t1["a"]="a",t1["b"]="b"} delete t1["a"] END{for(k in t1) print t1,t1[k]}'

8、流程控制语句

     每条命令语句后面能够用;分号结尾。

      条件判断语句

if(表达式) 
{语句1} 
else if(表达式) 
{语句2} 
else 
{语句3}

例子:

awk 'BEGIN{ test=100; 
if(test>90)
{ print "very good"; 
} else if(test>60)
{ print "good"; } else { print "no pass";
}
}'

  循环语句

while语句

while(表达式) 
{语句}

例子:

awk 'BEGIN{ 
test=100; 
total=0; 
while(i<=test){
 total+=i; i++; 
 } 
 print total; 
 }' 
 5050

for循环

for循环有两种格式:

格式1

for(变量 in 数组) 
{语句}

例1:

awk 'BEGIN{
name[1]="aa",
name[2]="bb"
}
END{
 for (k in name){
 print name[k],k 
}
}'

例2

awk 'BEGIN{ 
for(k in ENVIRON){
 print k"="ENVIRON[k];
 }

 }' 


TERM=linux
 G_BROKEN_FILENAMES=1 
SHLVL=1 pwd=/root/text 
... 
logname=root
 HOME=/root 
SSH_CLIENT=192.168.1.21 53087 22

注:ENVIRON是awk常量,是子典型数组。

 

格式2:

for(变量;条件;表达式) 
{语句}

例:

awk 'BEGIN{
 total=0; for(i=0;i<=100;i++){
 total+=i; 
} print total; 
}' 
5050

do循环

do {语句} 
while(条件)

例:

awk 'BEGIN{ 
total=0; i=0; 
do {total+=i;i++;}
 while(i<=100) 
print total; 
}' 
5050

其余语句

break 当 break 语句用于 while 或 for 语句时,致使退出程序循环。

continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。

next 能可以致使读入下一个输入行,并返回到脚本的顶部。这能够避免对当前输入行执行其余的操做过程。

exit 语句使主输入循环退出并将控制转移到END,若是END存在的话。若是没有定义END规则,或在END中应用exit语句,则终止脚本的执行。更多:http://man.linuxde.net/awk#awk命令格式和选项

相关文章
相关标签/搜索