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

相关文章
|
24天前
|
运维 监控 网络协议
|
10天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
28 3
|
1月前
|
存储 运维 搜索推荐
|
29天前
|
Linux Perl
Linux awk命令使用技巧
【10月更文挑战第16天】Linux awk命令使用技巧
28 4
|
2月前
|
运维 监控 数据处理
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
51 14
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
36 1
|
1月前
|
存储 安全 Linux
Linux文件管理命令md5sum awk
通过结合 `md5sum`和 `awk`,不仅可以高效地进行文件完整性校验,还能灵活地处理和分析校验结果,为系统管理、数据审计等工作提供强大的支持。
56 2
|
1月前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
42 1
|
1月前
|
Web App开发 运维 安全
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
|
2月前
|
运维 监控 Linux
深入理解Linux系统运维:命令行工具的力量
【9月更文挑战第14天】在Linux的世界里,命令行工具是系统管理员的瑞士军刀。本文将带你领略命令行的魅力,从基础操作到高级技巧,让你的运维工作更加高效和精准。准备好了吗?让我们一起开启这段探索之旅!