您的位置:首页 > 其它

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

2014-11-07 13:29 405 查看
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的高级用法即体现程序语言的用法请参考一下文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: