标签:linux运维
Linux运维 第二阶段(十五)awk
grep(global researchexpression,文件过滤器,根据模式将匹配到的行显示出来,#grep [options] pattern FILE,使用方法详见<shell基础>)
sed(stream editor,流编辑器,把每行读到内存空间(模式空间),默认不编辑源文件,仅对模式空间的数据作处理,处理结束将模式空间打印至屏幕,#sed [options] ‘AddressCommand’ file1...)
awk(三个人名的首字母a.w.k.,gawk(gnu awk,linux上实现的awk),nawk(new 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
打印:print;printf
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变量:
内置变量(记录变量):
FS(field separator,读取文本文件时使用的字段分隔符,默认空白字符,属输入分隔符);
RS(record separator,输入文本信息时所使用的换行符,属输入分隔符);
OFS(output FS);
ORS(output RS);
内置变量(数据变量):
NR(the total number ofinput records seen so far,所处理过的行数,若是多个文件,则是已处理过的多个文件的总行数,只要是处理过的统统全部记录,是绝对计数,例如#awk ‘{print NR}’ /etc/passwd /etc/shadow);
FNR(the input recordnumber in the current input file,记录的是正处理的行是当前这一文件中被处理的总行数的第多少行,是不同文件各自计数,例如#awk ‘{print FNR}’ /etc/passwd /etc/shadow);
NF(the number of fieldsin the current input record,总字段数,例如#awk -F: ‘/root/{print NF}‘ /etc/passwd)
注意:NF与$NF的区别,如#awk -F: ‘{print $NF}’ /etc/passwd(NF是总字段数,$NF是最后一个字段)
自定义变量:
#awk -v test=”hello world” ‘BEGIN{print test}’(方式一)
#awk ‘BEGIN{test=”hello world”;print test}’(方式二,注意action中有多个语句要用分号分隔,awk中引用变量值时不用加$)
awk操作符:
算术操作符(+,-,*,/,%,^)
赋值操作符(=,+=,-=,*=,/=,%=,^=,++,--,**=,|)
比较操作符(<,<=,>,>=,==,!=,~,!~,ELEMENT in array)
如:x~y(x是字符串,y是模式,x能被y匹配到则为真,否则假)
x!~y(x不能被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
awk的action(除打印print,printf外):
expression(赋值表达式,判断表达式)
control statement(可使用if,for,while,case等语句,还可定义函数)
compound statement(复合语句)
awk的控制语句controlstatement:
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 (variableassignment;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/passwd(length为awk的内置函数)
#awk -F: ‘{for(i=1;i<=3;i++)print $i}’ /etc/passwd
#awk -F: ‘{shell[$NF]++}END{for(c inshell) {print c,shell[c]}}’ /etc/passwd(统计当前系统各类shell的个数,print外的花括号可省)
#netstat -tan | awk ‘/^tcp/{state[$NF]++}END{for(cin 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]++
以上是学习《马哥运维课程》做的笔记。
本文出自 “Linux运维重难点学习笔记” 博客,谢绝转载!
标签:linux运维
原文地址:http://jowin.blog.51cto.com/10090021/1715339