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的高级用法即体现程序语言的用法请参考一下文章