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
{
}