内容简介:awk介绍 awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 有多种版本:New awk(nawk),GNU awk( gawk)
awk介绍
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk( gawk)
gawk:模式扫描和处理语言
基本用法:
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可以处理各种文档
行row:记录record
a 1:bb 2:cc 3
dd 4:ff 5
列column:字段 .域filed. 属性
awk语言
基本格式: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 } ,即打印每一个读取到的行,awk读取的每一行都会执行该语句块
awk
print格式: print item1, item2, …
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk ‘{print “hello,awk”}’
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
tail –3 /etc/fstab |awk ‘{print $2,$4}
awk变量
变量:内置和自定义变量
FS:输入字段分隔符,默认为空白字符
awk -v FS=’:’ ‘{print $1,FS,$3}’ /etc/passwd
awk –F: ‘{print $1,$3,$7}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ ‘{print $1,$3,$7}’ /etc/passwd
RS:输入记录分隔符,指定输入时的换行符
awk -v RS=’ ‘ ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=’ ‘ -v ORS=’###’‘{print }’ /etc/passwd
NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$
awk -F: ‘{print $(NF-1)}’ /etc/passwd
NR:记录号
awk ‘{print NR}’ /etc/fstab ; awk END'{print NR}’ /etc/fstab
awk
FNR:各文件分别计数,记录号
awk ‘{print FNR}’ /etc/fstab /etc/inittab
FILENAME:当前文件名
awk ‘{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk ‘{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
awk变量
自定义变量(区分字符大小写)
(1) -v var=value
(2) 在program中直接定义
示例:
awk -v test=’hello gawk’ ‘{print test}’ /etc/fstab
awk -v test=’hello gawk’ ‘BEGIN{print test}’
awk ‘BEGIN{test=”hello,gawk”;print test}’
awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd
cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
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
printf示例
awk -F: ‘{printf “%s”,$1}’ /etc/passwd
awk -F: ‘{printf “%s\n”,$1}’ /etc/passwd
awk -F: ‘{printf “%-20s %10d\n”,$1,$3}’ /etc/passwd
awk -F: ‘{printf “Username: %s\n”,$1}’ /etc/passwd
awk -F: ‘{printf “Username: %s,UID:%d\n”,$1,$3}’ /etc/passwd
awk -F: ‘{printf “Username: %15s,UID:%d\n”,$1,$3}’ /etc/passwd
awk -F: ‘{printf “Username: %-15s,UID:%d\n”,$1,$3}’ /etc/passwd
操作符
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, —
下面两语句有何不同
• awk ‘BEGIN{i=0;print ++i,i}’
• awk ‘BEGIN{i=0;print i++,i}’
操作符
比较操作符:
==, !=, >, >=, <, <=
模式匹配符:
~:左边是否和右边匹配包含 !~:是否不匹配
示例:
awk –F: ‘$0 ~ /root/{print $1}‘ /etc/passwd
awk ‘$0~“^root”‘ /etc/passwd
awk ‘$0 !~ /root/‘ /etc/passwd
awk –F: ‘$3==0’ /etc/passwd
操作符
逻辑操作符:与&&,或||,非!
示例:
• awk –F: ‘$3>=0 && $3<=1000 {print $1}’ /etc/passwd
• awk -F: ‘$3==0 || $3>=1000 {print $1}’ /etc/passwd
• awk -F: ‘!($3==0) {print $1}’ /etc/passwd
• awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
函数调用: function_name(argu1, argu2, …)
条件表达式(三目表达式):
selector?if-true-expression:if-false-expression
• 示例:
awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf
“%15s:%-s\n”,$1,usertype}’ /etc/passwd
awk PATTERN
PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk ‘/^UUID/{print $1}’ /etc/fstab
awk ‘!/^UUID/{print $1}’ /etc/fstab
(3) relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
示例:
• awk -F: ‘i=1;j=1{print i,j}’ /etc/passwd
• awk ‘!0’ /etc/passwd ; awk ‘!1’ /etc/passwd
• awk –F: ‘$3>=1000{print $1,$3}’ /etc/passwd
• awk -F: ‘$3<1000{print $1,$3}’ /etc/passwd
• awk -F: ‘$NF==”/bin/bash”{print $1,$NF}’ /etc/passwd
• awk -F: ‘$NF ~ /bash$/{print $1,$NF}’ /etc/passwd
显示bash结尾的行
awk PATTERN
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
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
示例
awk -F : ‘BEGIN {print “USER USERID”} {print $1″:”$3} END{print “end file”}’
/etc/passwd
awk -F : ‘{print “USER USERID“;print $1”:”$3} END{print “end file”}’ /etc/passwd
awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’ /etc/passwd
awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’END{print
“==============”} /etc/passwd
seq 10 |awk ‘i=0’
seq 10 |awk ‘i=1’
seq 10 | awk ‘i=!i‘
seq 10 | awk ‘{i=!i;print i}‘
seq 10 | awk ‘!(i=!i)’
seq 10 |awk -v i=1 ‘i=!i’
规则:在AWK里面空和0去反都是1
awk action
常用的action分类
• (1) Expressions:算术,比较表达式等
• (2) Control statements:if, while等
• (3) Compound statements:组合语句
• (4) input statements
• (5) output statements:print等
wk控制语句
{ 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
awk控制语句if-else
语法:if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
使用场景:对awk取得的整行或某个字段做条件判断
示例:
awk -F: ‘{if($3>=1000)print $1,$3}’ /etc/passwd
awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
awk ‘{if(NF>5) print $0}’ /etc/fstab
awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’
/etc/passwd
awk -F: ‘{if($3>=1000) printf “Common user: %s\n”,$1; else printf “root or Sysuser: %s\n”,$1}’
/etc/passwd
df -h|awk -F% ‘/^\/dev/{print $1}’|awk ‘$NF>=80{print $1,$5}‘
awk ‘BEGIN{ test=100;if(test>90){print “very good“}else if(test>60){ print “good”}else{print “no pass”}}’
awk控制语句
while循环
语法:while(condition){statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
示例:
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF)
{print $i,length($i); i++}}’ /etc/grub2.cfg
awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print
$i,length($i)}; i++}}’ /etc/grub2.cfg
awk控制语句
do-while循环
语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体
示例:
• awk ‘BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}’
awk控制语句
for循环
语法:for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iteration process)
{for-body}
特殊用法:能够遍历数组中的元素
语法:for(var in array) {for-body}
示例:
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’
/etc/grub2.cfg
性能比较
time (awk ‘BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}’)
time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)
time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)
time(seq –s ”+” 10000|bc)
awk控制语句
switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case
VALUE2 or /REGEXP2/: statement2; …; default: statementn}
break和continue
• awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0)continue;sum+=i}print sum}‘
• awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==66)break;sum+=i}print sum}‘
awk控制语句
break [n]
continue [n]
next:
提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
awk数组
关联数组:array[index-expression]
index-expression:
• (1) 可使用任意字符串;字符串要使用双引号括起来
• (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值
初始化为“空串”
• 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
示例:
• weekdays[“mon”]=”Monday“
• awk ‘BEGIN{weekdays[“mon”]=”Monday”;
weekdays[“tue”]=”Tuesday”;print weekdays[“mon”]}‘
• awk ‘!arr[$0]++’ dupfile
• awk ‘{!arr[$0]++;print $0, arr[$0]}’ dupfile
awk数组
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
注意:var会遍历array的每个索引
示例:
• awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]
=”Tuesday”;for(i in weekdays) {print weekdays[i]}}‘
• netstat -tan | awk ‘/^tcp/{state[$NF]++}END
{for(i in state) { print i,state[i]}}’
• awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}’ /var/log/httpd/access_log
netstat -nat:显示TCP所有状态。
awk函数
数值处理:
rand():返回0和1之间一个随机数
awk ‘BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }’
字符串处理:
• 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,…
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}
END{for (i in count) {print i,count[i]}}’
awk函数
自定义函数
格式:
function name ( parameter, parameter, … ) {
statements
return expression
}
示例:
cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
awk –f fun.awk
awk中调用shell命令
system命令
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用
空格分隔,或者说除了awk的变量外其他一律用””引用起来。
awk BEGIN'{system(“hostname”) }’
awk ‘BEGIN{score=100; system(“echo your score is ” score) }’
awk脚本
将awk程序写成脚本,直接调用或执行
示例:
cat f1.awk
{if($3>=1000)print $1,$3}
awk -F: -f f1.awk /etc/passwd
cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
chmod +x f2.awk
f2.awk –F: /etc/passwd
向awk脚本传递参数
格式:
awkfile var=value var2=value2… Inputfile
注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通
过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变
量都需要一个-v参数
示例:
cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
chmod +x test.awk
test.awk -F: min=100 max=200 /etc/passwd
本文来自投稿,不代表 Linux 运维部落立场,如若转载,请注明出处:http://www.178linux.com/99610
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 文本处理三剑客之 awk
- 监控三剑客之Nagios
- Linux三剑客之awk详解
- 监控三剑客<cacti、nagios、zabbix>
- 安卓AOP三剑客:APT,AspectJ,Javassist
- 容器技术|Docker三剑客之docker-swarm
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Security Testing Cookbook
Paco Hope、Ben Walther / O'Reilly Media / 2008-10-24 / USD 39.99
Among the tests you perform on web applications, security testing is perhaps the most important, yet it's often the most neglected. The recipes in the Web Security Testing Cookbook demonstrate how dev......一起来看看 《Web Security Testing Cookbook》 这本书的介绍吧!