awk用法总结

简介

awk的命名来自于他的三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan 的姓氏的首字母。
有多种版本:New awk(nawk),GNU awk( gawk) 一般在linux中awk就指gawk,gawk 是 AWK 的 GNU 版本
值得说的是,gawk被他的创始人定义为模式扫描和处理语言而不是文本处理工具,事实上gawk可以说就是一个文本分析工具。之所以awk被他的创始人定义为一门语言我想其寓意可能有两点,首先作为一门语言,awk会有自己比较丰富程序设计语言。其次也是awk功能强大的一种体现。
本文将会较为详细的介绍关于awk的各种用法,同时附带大量的示例实际操作,有助于大家理解。
基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块 、END语句块,共3部分组成
program通常是被单引号或双引号中建议使用单引号
选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量

一、语法

基本格式:
awk [options] 'program' file…
program:pattern{action statements;..}
pattern和action:
• pattern部分决定动作语句何时触发及触发事件
BEGIN,END
• action statements对数据进行处理,放在{}内指明
print, printf
分割符、域和记录:
awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称 为域标识。
$0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录
省略action,则默认执行 print $0 的操作

二、awk工作原理

第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这 个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个 可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如 打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果 没有提供pattern语句块,则默认执行{ print $0 },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

三、变量

awk中的变量有两种,内置变量和自定义变量

awk中的内置变量

  1. FS:输入字段分隔符,默认为空白字符
    awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
    awk –F: '{print $1,$3,$7}’ /etc/passwd
[root@CentOS6 ~]#awk -v FS=':' '{print $1,FS,$3}' /etc/passwd		#变量直接引用,awk同样可以引用bash中定义的变量
root : 0
bin : 1
daemon : 2
[root@CentOS6 ~]#s=':';awk -v FS="$s" '{print $1,$3}' /etc/passwd		#引用bash中定义的变量
root 0
bin 1
  1. OFS:输出字段分隔符,默认为空白字符
    awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
  2. RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
    awk -v RS=' ' ‘{print }’ /etc/passwd
  3. ORS:输出记录分隔符,输出时用指定符号代替换行符
    awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
  4. NF:字段数量
    awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$
[root@CentOS6 ~]#awk -F: '{print NF}' /etc/passwd
7		#统计行字段数,指定分隔符为:

awk -F: '{print $(NF-1)}' /etc/passwd

[root@CentOS6 ~]#awk -F: '{print $(NF-1)}' /etc/passwd
/root		#打印倒数第二个字段,分隔符为:
/bin		
/sbin
  1. NR:行号
    awk '{print NR}' /etc/fstab ;
    awk END'{print NR}' /etc/fstab
[root@CentOS6 ~]#awk 'END{print NR}' /etc/fstab 
16		#统计行号
  1. FNR:各文件分别计数,行号
    awk '{print FNR}' /etc/fstab /etc/inittab
    FILENAME:当前文件名
    awk '{print FILENAME}’ /etc/fstab
  2. ARGC:命令行参数的个数
    awk '{print ARGC}’ /etc/fstab /etc/inittab
    awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
[root@CentOS6 ~]#awk 'END{print ARGC}' /etc/fstab /etc/passwd
3		#一般认为命令之后的项目都是参数,但awk认为awk自身也是一个参数
  1. ARGV:数组,保存的是命令行所给定的各参数
    awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
    awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab

awk自定义变量

awk中的自定义变量区分大小写
两种定义方式:
(1) -v var=value
(2) 在program中直接定义
示例:

在program之外定义变量并引用
[root@CentOS6 ~]#awk -v test='hello,gawk' 'BEGIN{print test}' /etc/fstab 
hello,gawk
直接在program中定义以及引用变量
[root@CentOS6 ~]#awk -F: '{sex="male";print $1,sex,age;age=18}' /etc/passwd
root male 		#打印第一行时变量age还没有值所以第一行age不打印
bin male 18

四、操作符

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

=, +=, -=, *=, /=, %=, ^=

[root@CentOS6 ~]#awk 'BEGIN{print i++,i}'
0 1		#赋值打印先后问题
[root@CentOS6 ~]#awk 'BEGIN{print ++i,i}'
1 1
[root@CentOS6 ~]#awk  '{n=100;print sum+=n }' /etc/fstab 
100		#sum+=n就等于sum=sum+n
200
300

++, --

比较操作符:

==, !=, >, >=, <, <=
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配

[root@CentOS6 ~]#awk -F: '$0~/^root/{print $0}' /etc/passwd
#打印行首为root的行
root:x:0:0:root:/root:/bin/bash

逻辑操作符:与&&,或||,非!

awk中的逻辑操作符与或非值表示逻辑关系,不像bash中有短路效果

[root@CentOS6 ~]#awk -F: '!($3>=500){print $3}' etc/passwd
0		#打印小于500的UID
81
499

函数调用

function_name(argu1, argu2, ...)

条件表达式(三目表达式)

selector?if-true-expression:if-false-expression

[root@CentOS6 ~]#awk -F: '{$3>=500?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15-s:%-s\n",$1,usertype}' /etc/passwd
# 如果$3UID大于500定义变量,usertype用户类型是普通用户,否则定义变量usertype为系统管理员或者系统用户
#printf指定打印格式,$1用户名左对齐指定宽度15个字符,引用变量usertype左对齐,加换行符
root           :Sysadmin or SysUser
bin            :Sysadmin or SysUser
huxiaoqi       :Common User
gentoo         :Common User

五、awk PATTERN

PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk '/^UUID/{print $1}' /etc/fstab #打印行首为UUID行的第一条属性
awk '!/^UUID/{print $1}' /etc/fstab #打印行首不是UUID的第一条属性
(3) relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值

[root@CentOS6 ~]#awk -F: 'i=!i{print NR,$0,i}' /etc/passwd
#打印奇数行加行号和当时的i的值
#首次循环中,i的初始值为空,那么!i不为空,所以打印后续动作
#第二轮循环,i值初始值不为空,!i为空,跳过后续动作
1 root:x:0:0:root:/root:/bin/bash 1
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 1
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 1

(4)line ranges:行范围
startline,endline:/pat1/,/pat2/ 不支持直接给出数字
格式
awk -F: ‘/root>/,/nobody>/{print $1}' /etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd

[root@CentOS6 ~]#awk -F: '(NR>=10&&NR<=13){print NR,$1}' /etc/passwd	
10 uucp		#打印行号大于等于10并且小于等于13的用户名加行号
11 operator
12 games
13 gopher

(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
示例:

[root@CentOS6 ~]#awk -F: 'BEGIN{print "USER UID \n---------------"}{print $1,$3}END{print "===================="}' /etc/passwd
USER UID 
---------------
root 0
...
baobaotian 508
====================

六、awk action

action statements对数据进行处理,放在{}内指明
awk [options] 'program:pattern{action statements;..} ' file…
常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements:输入项目
(5) output statements:print等

print格式

要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、 变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}'

[root@CentOS6 ~]#awk '{print "hello,world"}'
haha		#每次从标准输入读入行都会打印“hello,world”
hello,world

awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd

[root@CentOS6 ~]#awk -F : '{print $1"\t"$3}' /etc/passwd
root	0	#-F: 指定:为分隔符
bin	1		#打印用户名和UID
daemon	2

tail –3 /etc/fstab |awk ‘{print $2,$4}’ #awk自动理解文件的分隔符

printf

格式化输出:printf “FORMAT”, item1, item2, ...
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐) %-15s
+:显示数值的正负符号 %+d

[root@CentOS6 ~]#awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
#指定$1是字符串,左对齐指定宽度20个字符,$3为十进制字符,默认右对齐宽度10个字符
#指定换行符\n
root                          0
bin                           1
daemon                        2

七、awk控制语句

主要的控制语句:
{ statements;… } 组合语句
if(condition) {statements;…} 条件判断语句
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…} 循环语句
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit

if-else语句:

语法:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2} else{statement3}使用场景:对awk取得的整行或某个字段做条件判断
示例:

[root@CentOS6 ~]#awk -F: '{if($3>=500){printf "Common user:%s\n",$1}else{printf"root or Sysuser: %s\n",$1}}' /etc/passwd		#条件判断语句后的多条statement要用大括号括起来
root or Sysuser: root	#如果UID大于等于500就打印用户名加"root or Sysuser:"
root or Sysuser: bin	#否则打印用户名加"Common user:"
Common user:huxiaoqi
Common user:gentoo
[root@CentOS6 ~]#df -h|awk -F% '/^\/dev\/sd/{print $1}'|awk '$NF>=10{print $1,$NF}'
/dev/sda2 11	#第一次awk过滤以取出/dev/sd开头的行,-F%指定分隔符打印$1目的是去掉%号让第二次可以对$NF直接进行数字比较
[root@CentOS6 ~]#awk 'BEGIN{test=87;if(test>90){print"Very good"}else if(test>60){print "good"}else{print "no pass"}}'
good	#先变量赋值,再使用条件判断语句判断变量,如果变量值大于90打印"Very good",如果变量值大于60打印"good",否则打印"no pass"

while循环

语法:
while(condition){statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用

[root@CentOS7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i)};i++}}' /etc/grub2.cfg
#/^[[:space:]]*linux16/ 匹配行首有任意数量空格跟linux16的行
#设定i初始值为1进入循环并且每次循环自增,(i<=NF)循环次数和字段数NF相等
#循环内置条件判断,判断length($i)shell内置函数字段长度大于等于10,那么就打印该字段以及字段长度
/vmlinuz-3.10.0-514.el7.x86_64 30	
root=UUID=851ee323-783c-44fe-93f5-333b9fe02b34 46
crashkernel=auto 16
LANG=en_US.UTF-8 16
net.ifnames=0 13
/vmlinuz-0-rescue-a8324cea4b7748b7a2b0c26dd1a9fa55 50
root=UUID=851ee323-783c-44fe-93f5-333b9fe02b34 46
crashkernel=auto 16
[root@CentOS6 ~]#cat f1.txt 
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20 
[root@CentOS6 ~]#awk '{i=1;sum=0;while(i<=NF){sum+=$i;i++};print sum,i}' f1.txt 
55 11	#将一条记录的所有字段加总
165 12	#每条记录进入循环以后sum清零
#内置循环,循环次数等于字段个数
#如果不清零每条记录的sum值那么将统计文本内所有字段的总和
[root@CentOS6 ~]#awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
5050		#设定初始值i=1;sum=0,i小于100进入循环每次自增1循环100次,计算1到100之间的数字之和

do-while循环

语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体

for循环

语法:
for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iteration process)
{for-body}
特殊用法:
能够遍历数组中的元素
语法:for(var in array) {for-body}

[root@CentOS6 ~]#time awk 'BEGIN{for(i=0;i<=1000000;i++){sum+=i}print sum}'
500000500000
real	0m0.120s
user	0m0.119s
sys	0m0.001s

bash awk性能比较

分别用shell,awk,bc计算1到1000000之间所有数字之和比较消耗时间
awk表现:

[root@CentOS6 ~]#time awk 'BEGIN{i=1;sum=0;while(i<=1000000){sum=sum+i;i++}print sum}'
500000500000	
real	0m0.216s
user	0m0.212s
sys	0m0.004s

shell表现:

[root@CentOS6 ~]#time (sum=0;for (( i=0; i<=1000000 ;i++ ));do let sum+=i;done;echo $sum)
500000500000
real	0m16.710s
user	0m15.939s
sys	0m0.767s

bc表现:

[root@CentOS6 ~]#time(seq -s "+" 1000000|bc)
500000500000	#seq -s "+" 指定seq分隔符为"+"
real	0m1.383s
user	0m1.320s
sys	0m0.085s

awk性能最佳

swich语句

swich语句作用类似bash中的case语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}

break和continue

[root@CentOS6 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0)continue;sum+=i}print sum}'
2500
#利用continue语句计算1到100之间所有奇数之和
#循环内置条件判断if(i%2==0)continue对i取模如果i为偶数实行continue跳过本次循环

与bash类似awk语句中break和continue同样支持指定跳过第几层循环
break [n]
continue [n]
next: 提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

[root@CentOS6 ~]#awk -F: '{if(NR%2!=0)next;print NR,$0}' /etc/passwd
#awk本身每条记录自带循环
#对行号取模如果结果非0也就是奇数行执行next,跳过该条记录,结果只打印偶数行
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync

八、awk数组

关联数组:array[index-expression]
index-expression: 数组索引、下标
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建 此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
注意:var会遍历array的每个索引

[root@CentOS6 ~]#awk -F: '{line[$7]++}END{for (i in line)print i,line[i]}' /etc/passwd
#利用数组总结各个shell类型出现个次数
#-F:指定文本的字段分隔符为":",$7就是shell类型
#$7shell类型作为关联数组line的下标索引,{line[$7]++}awk每条记录的每次循环都会给line[$7]重新付一次值,每次加一
#{for (i in line)print i,line[i]} for循环,把列表line也就是数组的下标赋值给变量i
/sbin/shutdown 1
/bin/csh 1
/bin/bash 10
/sbin/nologin 29
/sbin/halt 1
/bin/sync 1
[root@CentOS6 ~]#awk '{line[$1]++}END{for (i in line)print i,line[i]}' access_log |sort -nr -k2
#利用awk中的数组取出访问日志中各个ip地址访问的次数,排序之后将异常的ip取出
#sort -nr 从大到小排序,-k2 指定排序的参考项默认分隔符为空格
172.18.125.70 155364
172.18.22.188 9367
...

利用数组去重:

[root@CentOS6 ~]#awk -F: '!line[$7]++' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
gentoo:x:501:501:Gentoo Distribution:/home/gentoo:/bin/csh
#-F:指定字段分隔符为":",$7为shell类型
#awk每条记录的循环会给line[$7]赋一次值,不同shell类型为索引的数组首次循环都为空串数组,!line[$7]++所以首次结果为真默认执行打印$0
#首次以后关联数组被赋值!line[$7]++的结果都为假,不执行打印动作

统计连接状态:

[root@CentOS6 ~]#netstat -nat |awk '/^tcp/{stat[$NF]++}END{for(i in stat)print i,stat[i]}'
ESTABLISHED 2
LISTEN 10

统计ip访问连接量

[root@CentOS6 ~]#netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address   Foreign Address State      
tcp 0 64 172.18.45.6:22  172.18.45.107:2585  ESTABLISHED 
tcp 0  0 172.18.45.6:22  172.18.45.107:4262  ESTABLISHED 
#命令原始状态
[root@CentOS6 ~]#netstat -nt | awk -F'[[:space:]:]+' '/^tcp/{ip[$6]++}END{for (i in ip)print i,ip[i]}'
172.18.45.107 2
#-F'[[:sapce:]:]+' 指定空格和":"都作为字段分隔符$6就是ip地址

求男女平均分:
数组写法

[root@CentOS6 bin]#cat score.txt 
mage 100 male
wang 90 male
zhang 80 female
li 100 female
[root@CentOS6 bin]#awk '{total[$3]+=$2;num[$3]++}END{for(name in total){print name,total[name],total[name]/num[name]}}' score.txt  
female 180 90
male 190 95
#total[$3]+=$2 分别加总男女总分
#num[$3]++ 分别加总男女个数
#for(name in total)将total数组下标赋值给变量name
#print name为打印性别
#print total[name]为打印男女各自总分
#print total[name]/num[name]为打印平均分

变量写法:

[root@CentOS6 bin]#awk '{if($3 == "male"){msum+=$2;mnum++}else{fsum+=$2;fnum++}}END{printf "msum=%d  mavg=%.2f\nfsum=%d favg=%.2f\n",msum,msum/mnum,fsum,fsum/fnum}'  score.txt 
msum=190  mavg=95.00
fsum=180 favg=90.00

九、awk函数

内置函数

数值处理:
rand():返回0和1之间一个随机数

[root@CentOS6 ~]#awk 'BEGIN{srand(); print rand() }' 
0.70397
[root@CentOS6 ~]#awk 'BEGIN{srand(); print int(rand()*100) }' 
62
#int(rand()*100) 原始命令生成的是小数乘以100就是生成100以内的随机数,int命令取整

字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹 配的内容替换为s
echo "2008:08:08 08:08:08" | awk 'sub(/😕,“-",$1)'
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换 为s所表示的内容
echo "2008:08:08 08:08:08" | awk ‘gsub(/😕,“-",$0)'
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存 至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
利用split函数实现总结连接数

[root@CentOS6 ~]#netstat -tn | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
172.18.45.107 2
#split($5,ip,":") 将$5以":"为分隔符切片,第一部分是ip地址赋值给数组ip[1],第二部分是端口号赋值给数组ip[2]...
#再将数组ip作为数组count的索引号嵌套数组,数组count每次循环自增赋值
#for循环遍历数组count取出连接数

自定义函数

格式:

function name ( parameter, parameter,  ... ) { 
	statements 
	return expression 
}

示例:

[root@CentOS6 ~]#awk -v a=23234 -v b=22343 -f f1.txt 
23234
[root@CentOS6 ~]#cat f1.txt 
function max(v1,v2) { 
	v1>v2?var=v1:var=v2		#三目表达式如果vi>v2那么var=vi,否则var=v2 也就是比较两个数字的最大值
	return var 
} 
BEGIN{print max(a,b)}		#调用时需要给变量a,b赋值

十、awk中调用shell命令

system命令
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律 用""引用起来。
示例:

[root@CentOS6 ~]#awk BEGIN'{system("hostname")}'
CentOS6.Ronaldo
[root@CentOS6 ~]#awk 'BEGIN{score=100; system("echo  your score is " score) }'
your score is 100

十一、awk脚本

将awk程序写成脚本,直接调用或执行
示例:
第一种方法将语句awk [options] 'program' file… 中的program写成脚本让后调用

[root@CentOS6 ~]#cat f1.awk 
{if($3>=1000)print $1,$3} 
[root@CentOS6 ~]#awk -F: -f f1.awk /etc/passwd

第二中方法将整个语句写成脚本,加执行权限以后指定字段分割符直接用

[root@CentOS6 ~]#cat f2.awk 
#!/bin/awk –f 
#this is a awk script 
{if($3>=1000)print $1,$3} 
[root@CentOS6 ~]#chmod +x f2.awk 
[root@CentOS6 ~]#f2.awk –F:  /etc/passwd

十二、向awk脚本传递参数

格式:
awkfile var=value var2=value2... Inputfile
注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到 变量的值。命令行中每一个指定的变量都需要一个-v参数

[root@CentOS6 ~]#cat  test.awk   
#!/bin/awk –f 
{if($3 >=min && $3<=max)print $1,$3} 
[root@CentOS6 ~]#chmod +x test.awk 
[root@CentOS6 ~]#test.awk -F: min=100 max=200  /etc/passwd

关于awk较为基础的用法就介绍到这儿啦,如果有疑问以及需要指正的地方请留言吧。

posted @ 2017-09-11 16:07  奇哥与李妞  阅读(487)  评论(0编辑  收藏  举报