Linux运维 第二阶段(十五)awk

grepglobal research expression,文件过滤器,根据模式将匹配到的行显示出来,#grep  [options]  pattern FILE,使用方法详见<shell基础>

sedstream editor,流编辑器,把每行读到内存空间(模式空间),默认不编辑源文件,仅对模式空间的数据作处理,处理结束将模式空间打印至屏幕,#sed  [options]  ‘AddressCommand’  file1...

awk(三个人名的首字母a.w.k.gawkgnu awklinux上实现的awk),nawknew awk),报告生成器,在文本文件中抽取符合条件的信息,并以特定格式显示)

 

 

#awk options  ‘SCRIPTS’  FILE1 FILE2

#awk options  ‘PATTERN{ACTION}’ FILE1  FILE2(根据模式将匹配到数据的行作处理,一般的处理就是打印)

注:根据模式每次从文件中抽取一行,对这行按指定的分隔符进行切片,若没指定分隔符默认是按空白字符(空格)切片,指定分隔符使用-Fseperater,例如文本内容:this  is  a  test,被切成四个片段,而这每个片段在awk内部能用变量来引用,这个变量类似脚本编程中的位置参数变量,$1表示this$2表示is$0表示这行全部(可以切割的还有cut

举例:

#awk -F:  ‘{print  $1,$3}’ /etc/passwd$1$2条目间用逗号分开)

#awk  ‘BEGIN{FS=”:”}{print  $1,$3}’ /etc/passwd

#cut -d:  -f1,3  /etc/passwd

 

 

打印:printprintf

print item1,item2,……

注意:

item间用逗号分隔,输出时默认各条目引用的内容用空白字符分隔;

输出的item(可以是字符串,数值,当前记录的字段$1,$2等变量,awk的表达式(若是数值会先转为字符串而后才输出));

item若省略则是输出全部内容,如print  $0

若想输出空白行,使用print  “”

 

printf “FORMAT”,item1,item2

注意:

print最大不同,printf输出时要指定格式;

FORMAT要用双引号引起来,它用于指定后面item输出时的格式,格式与格式间不用分隔符分隔;

printf不会自动打印换行符;

FORMAT的指示符都以%开头,后跟一个字符,有:%c(显示字符的ASCII码),%d%i(十进制整数),%e%E(科学计数法显示数值),%f(浮点数),%g%G(科学计数法或浮点数格式显示数值),%s(字符串),%u(无符号整数),%%(显示%自身)

修饰符有:-(表示左对齐),+(显示数值符号),NUM(表示数字,显示宽度)

举例:

#awk -F:  ‘{printf  “%-10s%-10s\n”,$1,$3}’  /etc/passwd

 

 

awk变量:

内置变量(记录变量):

FSfield separator,读取文本文件时使用的字段分隔符,默认空白字符,属输入分隔符);

RSrecord separator,输入文本信息时所使用的换行符,属输入分隔符);

OFSoutput FS);

ORSoutput RS);

 

内置变量(数据变量):

NRthe total number ofinput records seen so far,所处理过的行数,若是多个文件,则是已处理过的多个文件的总行数,只要是处理过的统统全部记录,是绝对计数,例如#awk  ‘{print  NR}’ /etc/passwd  /etc/shadow);

FNRthe input recordnumber in the current input file,记录的是正处理的行是当前这一文件中被处理的总行数的第多少行,是不同文件各自计数,例如#awk  ‘{print  FNR}’ /etc/passwd  /etc/shadow);

NFthe number of fieldsin the current input record,总字段数,例如#awk  -F:  '/root/{print NF}'  /etc/passwd

注意:NF$NF的区别,如#awk  -F:  ‘{print $NF}’  /etc/passwdNF是总字段数,$NF是最后一个字段)

 

自定义变量:

#awk -v  test=”hello world”  ‘BEGIN{print test}’(方式一)

#awk ‘BEGIN{test=”hello world”;print test}’(方式二,注意action中有多个语句要用分号分隔,awk中引用变量值时不用加$

 

 

awk操作符:

算术操作符(+-*/%^

赋值操作符(=+=-=*=/=%=^=++--**=|

比较操作符(<<=>>===!=~!~ELEMENT in array

如:x~yx是字符串,y是模式,x能被y匹配到则为真,否则假)

x!~yx不能被y匹配到则为真,否则假)

ELEMENT in  array(数据组中有这个元素则为真,否则假)

表达式间的逻辑关系(&&||

条件表达式(selector?if-true-exp:if-false-exp,相当于if条件判断)

 

 

awk的模式:

正则表达式REGEXP,格式为:/regular express/

表达式expression

匹配范围ranges,用逗号分隔,如pattern1,pattern2

BEGIN(在第一行执行前就执行)

END(在最后一行执行完才执行)

空模式(对文件的每一行都处理)

举例:

#awk -F:  ‘/^r/{print  $1}’ /etc/passwd

#awk -F:  ‘$3==0,$7~”nologin”{print  $1,$3,$7}’ /etc/passwd

#awk -F:  ‘$3>=500{print  $1,$3}’ /etc/passwd

#awk -F:  ‘$7~”bash$”{print  $1,$7} /etc/passwd

#awk -F:  ‘$7!~”bash$”{print  $1,$7} /etc/passwd

#awk -F:  ‘BEGIN{print  “Username  ID   Shell”}{print  $1,$3,$7}END{print  “End of  file}’  /etc/passwd

 

 

awkaction(除打印print,printf外):

expression(赋值表达式,判断表达式)

control statement(可使用if,for,while,case等语句,还可定义函数)

compound statement(复合语句)

 

 

awk的控制语句control statement

if-else语法:if(condition){then-body} else {else-body}(其中then-body仅一个语句时花括号可省)

while语法:while(condition){statement1,statement2,……}(若statement仅一个语句时花括号可省)

do-while语法:do{statement1,statement2,……} while {condition}

for语法一:for (variable assignment;condition;interation process) {statement1,statement2,……}

for语法二:for(variable  in  array) {statement1,statement2,……}(数组中应用)

case语法:switch(expression) {case  VALUE or /REGEXP/:statement1,statement2,…… default:statement1,statement2,……}

break,continue

next(提前结束本行文本的处理,接着处理下一行)

举例:

#awk -F:  ‘{if ($1==”root”)print  $1,”Admin”;else  print $1,”Common User”}’  /etc/passwd

#awk -F:  -v  sum=0  ‘{if($3>=500)sum++}END{print  sum}’  /etc/passwd

#awk -F:  ‘{i=1;while(i<=NF){if(length($i)>=4){print $i};i++}}’ /etc/passwdlengthawk的内置函数)

#awk -F:  ‘{for(i=1;i<=3;i++)print  $i}’ /etc/passwd

#awk -F:  ‘{shell[$NF]++}END{for(c in shell) {print  c,shell[c]}}’  /etc/passwd(统计当前系统各类shell的个数,print外的花括号可省)

#netstat -tan  |  awk  ‘/^tcp/{state[$NF]++}END{for(c in state)print  c,state[c]}’(统计tcp的不同状态,重要!!!常用)

#awk ‘{count[$1]++}END{for(ip  in  count)print c,count[ip]}’ /var/log/httpd/access_log(统计日志中各单客户端IP连接数)

注:awk数组中下标是从1开始的(而bash中的数组下标是从0开始),而且awk数组中下标可以不是数字,可自定义任意字符串,例如上面几个例子中的shell[/bin/bash]++shell[/sbin/nologin]++state[LISTEN]++state[ESTABLISHED]++count[192.168.1.59]++count[192.168.1.222]++

 


本文转自 chaijowin 51CTO博客,原文链接:http://blog.51cto.com/jowin/1715339,如需转载请自行联系原作者

上一篇:Linux磁盘冗余,文件访问列表


下一篇:Linux运维比较实用的工具