Linux运维 第二阶段(十五)awk-阿里云开发者社区

开发者社区> 技术小阿哥> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
7991 0
linux运维——基础篇
说到服务器操作系统,linux的各种发行版本以毫无悬念的姿态占领了绝大部分的市场份额。常见的桌面操作系统Windows与Linux在操作上有着很大的区别。
1352 0
运维linux命令
运维linux命令1、linux启动过程 开启电源 --> BIOS开机自检 --> 引导程序lilo或grub--> 内核的引导(kernel boot)--> 执行init(rc.sysinit、rc)--> mingetty(建立终端) -->Shell 2、网卡绑定多ip ifconfig eth0:1 192.
2830 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
9759 0
Linux运维常用命令-linux服务器代维常用到的维护命令
1.删除0字节文件find -type f -size 0 -exec rm -rf {} ; 2.查看进程按内存从大到小排列ps -e   -o “%C   : %p : %z : %a”|sort -k5 -nr 3.
1660 0
13694
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载