awk的详解 基本用法和高级用法

1 awk 用途  报告生成工具,主要在处理文本方面特别强大,也是一个独立的程序语言,与grep sed 构成处理文本工具的三剑客。

同gawk 都是 GNU组织开发的开源工具

2 awk的工作原理,已每个记录进行每个域的分离,如 常常是以每一行作为一个记录,空白作为默认的与分隔符,然后以内置变量对每个域进行赋予变量!

 

3 语法结构

    awk option scrips file  

或这 echo “ ” | awk  option scripts 管道使用

 

option 选项主要有

-F  指定分隔符,而不以默认的空白(空格符或者制表符)

-v  指定变量

-f   指定脚本的文件名,即将脚本放入一个文件当中,避免awk书写太长,影响视觉,和重复编写

 

scripts 是对 处理的文本进行的操作

awk程序用一对花括号来定义,必须将脚本命令放到两个花括号当中。花括号必须用单引号引起来

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

4 awk基本学会技能

  1、使用数据字段变量  $1 ,$2,....$n

  2、在脚本中使用多个命令 使用 ;

  3、从文件中读取脚本程序 使用 -f

  4、在处理数据前运行的某些脚本内容  BEGIN

  5、在处理数据后运行的某些脚本内容  END

 

5 简单用法事例讲解

实例一: 初识awk

[root@shiyan ~]# echo "how are you" | awk '{print $1,"\t",$3}'

how    you

 

讲解 awk 输入流how are are 文本进行处理,首先 以空白进行分割字段域(filed) 然后用内置变量进行赋值

内置变量

$1 等于第一段域  实例中即 为how

$2 等于第二段域  实例中即 为 are

$3 等于第三段域  实例中即 为 you

如果还有段域 则依次类推 $4  ...$n

最后$0  等于整个记录,即整行文本  how are you

 

此处没有使用 option,使用默认的 空白 进行分割

scripts 为print $1,"\t",$3   打印第一个字段  和一个 制表符 和第三个字段

 

实例二:提取/data 分区的使用率

[root@shiyan ~]# df -h | grep "/data"

/dev/sda7        97G  1.2G   91G   2% /data

 

[root@shiyan ~]# df -h | grep "/data" | awk -F '[ \t%]+' '{print $5}'

2

解释 一步完成了对/data 使用率的提取 使用率为2 ,-F 后面的指定分隔符时支持正则表达式的,此处为可以一空白 制表符 % 作为分隔符,且可以是N 个

上面也可以用如下进行,但显得不够专业,使用了两次awk

[root@shiyan ~]# df -h | grep "/data" | awk '{print $5}' | awk -F '%' '{print $1}'

2

 

实例三 -f 的用法

[root@shiyan awk]# awk -F : '{test=" home directory is "; print $1,test, $6}' /etc/passwd

-f 的实现办法

1 首先将 scripts 部分写入一个文件当中

[root@shiyan awk]# cat awkfile 

{

test="home directory is"

print $1, test, $6

}

 

[root@shiyan awk]# awk -F : -f awkfile  /etc/passwd

root home directory is /root

bin home directory is /bin

 

实现的效果一样,有时时非常有必要将处理脚本放入一个特定的文件中的,test="home directory is"  时test变量的赋值

 

实例四 -v选项的用法

[root@shiyan awk]# awk -F :  -v test="home directory is" '{ print $1, test, $6}' /etc/passwd

结果同上实例,-v 指定对test 变量赋值

 

 实例五: BEGIN在处理数据前运行某些脚本

如:

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd

解释:BEGIN关键字会执行一次指定的脚本段,想要处理数据的脚本段在第二个程序中定义{ print $1,"\t\t", $7}

结果: 加上了 User ---------Sheel 的抬头

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd

User -------------- Shell

root  /bin/bash

bin  /sbin/nologin

.....

 

实例六: END

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}END {print "The is last Line"}' /etc/passwd

结束 在所有操作完成之后,执行 END关键字定义的脚本段 END {print "The is last Line"}

 

注意: 两段或者三段脚本命令 在awk上会被当成一个文本字符串,所以必须要加上一个 单引号

 

 

awk的高级用法即体现程序语言的用法请参考一下文章

 

posted @ 2014-11-07 13:29  小小龟侠  阅读(3798)  评论(0编辑  收藏  举报