您的位置:首页 > 运维架构 > Shell

shell编程基础【七】---awk

2011-12-13 11:48 459 查看
AWK

简介:AWK是一个优秀的文本处理工具,同时也是一个强大的数据处理引擎。它有自己

的语法结构、流程控制

等,可以编写AWK程序。作为文本处理来讲,用得比较多的是提取列。



AWK基本格式:

awk option '{ command }' file_name





AWK调用方式:

1、命令行

awk -F: '{printf("%-20s%d\n", $1,$3)}' /etc/passwd



2、使用-f 指定命令文件

awk -F: -f awk.ctl /etc/passwd



3、写成AWK程序,利用命令解释器调awk程序

cat awk1.awk

#!/bin/awk -f

BEGIN {

print "starting ... "

FS=":"

u1="User Name:"

u2="User ID:"

}

{

printf ("%s%-20s%s%d\n",u1,$1,u2,$3);



}

END {

print "End"

}

调用:

./awk1.awk /etc/passwd



AWK调用系统命令

system ("command")





#!/bin/awk -f

BEGIN {

system("ls")

system("date")

}



使用数据字段变量

$0 整行文本

$1 第一个字段

$n 第n个字段



例:显示每个文件的名字和大小

ll | awk '{print $8,$5}'

在程序中执行多个命令

命令间分号分隔

ll | awk '{printf ("%s ",$8);print $5}'





数据处理前运行的脚本段(BEGIN)

例:

[root@t176 ule]# awk 'BEGIN{print "Starting ..."} {print $1,$3}' /etc/passwd

Starting ...

root:x:0:0:root:/root:/bin/bash



数据处理后运行的脚本段(END)

awk 'BEGIN{print "Starting ..."} {print $1,$3} END{print "END" }' /etc/passwd

AWK 变量

AWK支持两种类型变量

内置变量

用户自定义变量



内置变量:

FS 字段分隔符

NF 输入文件中字段个数

NR 已处理的记录个数

FNR 文件记录号

FIELDWIDTHS 字段宽度

自定义变量

组成字符:字母、数字、下划线,但不能以数字开头。AWK变量区分大小写

引用变量时,与SHELL不同大部分不要在前面加 $ ,只有一些特殊的变量前加 $,如 $n 取第n个字段





变量赋值

命令行:

[root@t176 ule]# awk 'BEGIN{t="this is a test";print t}';

this is a test



命令文件中:

命令文件中定义变量,由运行时给值

[root@t176 ule]# cat awk2.ctl

BEGIN {

FS=":"

}

{

print $n

}

[root@t176 ule]# awk -f awk2.ctl n=7 /etc/passwd



但以上变量取值时会存在一个问题,在BEGIN段取不到值,解决办法是在命令

行调用时加 -v 参数

[root@t176 ule]# cat awk3.ctl

BEGIN {

print "n=",n

FS=":"

}

{

print $n

}

[root@t176 ule]# awk -f awk3.ctl n=1 pa

n= -- 此时n因为在begin部分,没取到值

root

bin

daemon

rlp

shutdown

rialt

news



[root@t176 ule]# awk -f awk3.ctl -v n=1 pa

n= 1

root

bin

daemon

rlp

shutdown

rialt

news



定义数组:

var_name[index]=value



root@t176 ule]# awk 'BEGIN{ar[1]="abc";ar[2]=123;print ar[1]}'

abc



删除变量

delete var_name[index]

遍历数组:

for (var in array)

{





}



awk 'BEGIN

{var["a"]=1;var["b"]=2;var["c"]=3;

for (t in var) {print "t="t,"var["t"]="var[t]}}'



t=a var[a]=1

t=b var[b]=2

t=c var[c]=3

AWK使用正则表达式

匹配符: ~ /正则表达式模式/ ! ~ /正则表达式模式/





数学表达式和bash也有所不同

>

>=

<

<=

==

!=

AWK的流程控制

选择:

if (条件)

{



}





if (条件)

{



}

else

{



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: