第八周总结

栏目: 服务器 · 发布时间: 6年前

awk 控制语句

{ 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  只显示最后一个字段是 /bin/bash 的行的第一个字段

第八周总结

awk ‘{if(NF>5)print $0}’ /etc/fstab  意思是只显示每行字段数大于 5 的行

awk -F: ‘{if($3>=1000){printf “common user:%s\n”,$1}else{printf “root or sysuser:%s\n”,$1}}’ /etc/passwd 

对每行进行判断,如果 uid 大于等于 1000 ,则显示 common user ,否则显示 root or sysuse

第八周总结

awk -F: ‘{if($3>=1000) printf “Common user: %s\n”,$1; else printf “root or Sysuser: %s\n”,$1}’  /etc/passwd  注意:如果 ifelse 后面只有一条语句,可以不写大括号,但是如果后面跟多条语句必须写大括号,建议写大括号!

df -h|awk -F% ‘/^\/dev\/sd/{print $1}’|awk ‘$NF>=80{print $1,$5}’

意思是如果分区利用率大于 80 ,则显示分区名及分区利用率。

awk ‘BEGIN{test=100;if(test>90){print “very good”}else if(test>60){print “good”}else{print “no pass”}}’  显示

awk 控制语句

while 循环  ( 对行里的字段进行循环, awk 自带行循环功能 )

语法: while(condition){statement;…}

条件 ,进入循环;条件 ,退出循环

使用场景:

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

示例:

awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF){{print $i,length($i)};i++}}’ /etc/grub2.cfg  显示 linux16 那一行的每个字段及每个字段的长度

^[[:space:]]* 意思是以空格开头,空格可有可无

第八周总结

awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i)};i++}}’ /etc/grub2.cfg

意思是显示 linux16 那一行中,字段长度大于等于 10 的字段及字段长度

第八周总结

awk ‘BEGIN{print length(“dadsad”)}’  显示字符串的长度,必须使用双引号引上!

awk ‘BEGIN{print length(“dadsad 我们 “)}’  显示 8

awk 控制语句

do-while 循环

语法: do{statement;…}while(condition)do{ 循环体 }while (条件)

意义:无论真假,至少执行一次循环体

示例:用 awk 方式实现 1+2+3+..100

方法一:

awk ‘BEGIN{total=0;i=0;do{total+=i;i++;}while(i<=100);print total}’

方法二: awk ‘BEGIN{i=1;while(i<=100){sum=sum+i;i++};print sum}’ 或者

awk ‘BEGIN{i=1;while(i<=100){sum=sum+i;i++};{print sum}}’

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

第八周总结

例题:用 awkfor 循环方式实现 1+2+3+..100

awk ‘BEGIN{for(i=1;i<=100;i++){sum=sum+i};{print sum}}’

注意:在 awk 语句内的变量,在 awk 语句结束后就消失了,与 bash 不同!!!

性能比较

time (awk ‘BEGIN{ total=0;for(i=0;i<=1000000;i++){total+=i;};print total;}’)  效率最高

time(total=0;for i in {1..1000000};do total=$(($total+i));done;echo $total)

time(for ((i=0;i<=1000000;i++));do let total+=i;done;echo $total) 效率最低

time(seq -s + 1000000 | bc)

awk 控制语句

switch 语句

语法: switch(expression) {case VALUE1 or /REGEXP/:statement1; case

VALUE2 or /REGEXP2/:statement2; …; default:statementn}  注意格式冒号

switch 后面跟的表达式如果等于 VALUE1 or /REGEXP/ ,则执行 statement1 ,如果等于 VALUE2 or /REGEXP2/ ,则执行 statement2 ,如果都不等于,则执行 statementn

breakcontinue

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}’

意思是当加到 66 时结束循环( break

练习:计算 1+2+3+..100 中的奇数和及偶数和

奇数和 显示 2500

awk ‘BEGIN{for(i=1;i<=100;i++){if(i%2==0){continue}else{sum=sum+i}}

print sum}’

偶数和 : 显示 2550

awk ‘BEGIN{for(i=1;i<=100;i++){if(i%2==1){continue}else{sum=sum+i}};

print sum}’

awk 控制语句

break [n]

continue [n]

next:

提前结束对本行处理而直接进入下一行处理( awk 自身循环)

awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd 或者

awk -F: ‘{if($3%2!=0) next; {print $1,$3}}’ /etc/passwd

意思是如果第三列是奇数,则不做任何处理,直接进入下一行,说白了就是显示第三列是偶数行的第一和第三字段

第八周总结

awk -F: ‘{if($3>10){print $1,$3};if($3<100){print $1,$3}}’ /etc/passwd

注意:这样写,分号两侧的语句是逻辑或的关系!这条代码的意思是显示全部行的 $1$3

awk -F: ‘{if( $3>10&&$3<100 ){print $1,$3}}’ /etc/passwd

这样写才能实现并且的逻辑关系,显示 $3 大于 10 小于 100 的行的 $1$3

第八周总结

awk 数组( awk 中数组就是关联数组,没有普通数组的说法)

关联数组: array[index-expression]

index-expression:

(1) 可使用任意字符串;字符串要使用双引号括起来

(2) 如果某数组元素事先不存在,在引用时, awk 会自动创建此元素,并将其值

初始化为“空串”!

  若要判断数组中是否存在某元素,要使用 “index in array” 格式进行遍历, index 代表下表变量, array 代表数组名称!

示例:

weekdays[“mon”]=”Monday”  awk 中给数组赋值的方式,双引号必须加

awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]=”Tuesday”;

print weekdays[“mon”]}’

awk ‘!arr[$0]++’ f1

去掉重复行!

awk ‘{!arr[$0]++;print $0, arr[$0]}’ f1

第八周总结

例如:为数组赋值并打印

awk ‘BEGIN{title[“ceo”]=”mage”;tile[“coo”]=”zhangsir”;{print title[“ceo”]}}’

例如: vim f1

第八周总结

awk ‘!arr[$0]++’ f1

!arr[$0]++ 的意思是先对 arr[$0] 取反,同时 arr[$0]=arr[$0]+1

逻辑是:

当第一行读入, arr[“aaa”]= “”,

此时 !arr[“aaa”]=1arr[“aaa”]=arr[“aaa”]+1=””+1=1 ,说明 arr[“aaa”]=1

!arr[“aaa”]=1 为真,真则执行后面隐藏掉的 print $0, 打印第一行。

第二行、第三行的执行结果同第一行

第四行时, arr[“aaa”]=1!arr[“aaa”]=0 ,为假,则不执行 print $0 ,但 arr[“aaa”]=1+1=2

说白了,这个命令的意思是去掉重复行!

sort -u f1 这个命令也可以去重!

awk ‘!++arr[$0]’ f1  什么都不打印

逻辑是第一行读入时 arr[“aaa”]=””, 先执行 ++arr[“aaa”] ,则

arr[“aaa”]=””+1=1 ,取反则为 0 ,假,则不执行 print $0, 以此类推

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

练习:运用 for 遍历来打印数组元素!

awk ‘BEGIN{title[“ceo”]=”mage”;title[“coo”]=”zhangsir”;

title[“cto”]=”wang”;for(i in title){print title[i]}}’  显示如图

第八周总结

练习:

systemctl start httpd

netstat -nat

第八周总结

ab -c 100 -n 2000 http://192.168.30.7:9527 并发访问

bc 命令需要安装包 yum install httpd-tools

第八周总结

如果想统计每种状态有多少次,如何实现?

netstat -tan | awk ‘/^tcp/{state[$NF]=state[$NF]+1}END{for(i in state){print i,state[i]}}’

第八周总结

例如:统计 /var/log/httpd/access_log 哪些 ip 在访问,分别访问了多少次?

cat access_log | awk ‘/^[0-9]+/{ip[$1]=ip[$1]+1}END{for(i in ip){print i,ip[i]}}’

第八周总结

例如:编写脚本,分析上题结果,凡连接数超过 1000 的地址,将其放入防火墙中:

iptables -A INPUT -s 172.20.111.65 -j REJECT172.20.111.65 扔到防火墙里

答:方法一: cat access_log | awk ‘/^[0-9]+/{ip[$1]=ip[$1]+1}END

{for(i in ip){if(ip[i]>10000){print i}}}’ | while read line;do iptables -A INPUT -s $line -j REJECT;done

查询将哪些地址放入防火墙内: iptables -vnL

清空防火墙内的地址: iptables -F

方法二: cat access_log | awk ‘/^[0-9]+/{ip[$1]=ip[$1]+1}END{for(i in ip){print i,ip[i]}}’ | awk ‘{if($2>=1000){system(” iptables -A INPUT -s ” $1 ” -j REJECT “)}}’

例如:显示上题中连接数排名前十的 ip 地址

cat access_log | awk ‘/^[0-9]+/{ip[$1]=ip[$1]+1}END{for(i in ip){print i,ip[i]}}’ | sort -k 2 -nr | head

注意: sort -k 2 -nr 意思是按第二列的数字排序,而且是倒序!

例如:统计文档 /etc/rc.sysinit 内每个单词及出现的次数 基本格式 awk ‘{}END{}’

awk ‘{for(i=1;i<=NF;i++){word[$i]=word[$i]+1}}END{for(j in word){print j,word[j]}}’ /etc/rc.sysinit

例如:有一个成绩表,格式是姓名、分数、性别,如下图

第八周总结

统计男生的平均成绩和女生的平均成绩?

awk ‘{if($3==”m”){sum_m=sum_m+$2;num_m=num_m+1}else{sum_f=sum_f+$2;

num_f=num_f+1}}END{printf “male:%.2f\nfemale:%.2f\n”,sum_m/num_m,

sum_f/num_f}’ score.txt

注意:下图写法不对, END 内语句如果不遍历,那么是不能引用数组的!!!

第八周总结

用数组写

awk ‘{sum[$3]=sum[$3]+$2;num[$3]=num[$3]+1}END{for(i in num){

print i,sum[i]/num[i]}}’ score.txt

awk 函数(引用函数的时候必须带小括号!)

数值处理:

rand() :返回 01 之间的一个随机数,说是随机数,但实际上是一个固定的 0.237788 ,如果想生成 0-1 的任何一个随机数,需要借助 srand() 这个种子才可以 .

例如: awk ‘BEGIN{print rand()}’  只显示 0.237788

awk ‘BEGIN{srand();print rand()}’  才能实现 0-1 之间的随机数

awk ‘BEGIN{srand();print int(rand()*100)}’ 显示 100 之内随机的整数

awk ‘BEGIN{srand();for(i=1;i<=100;i++){print int(rand()*100)}}’

意思是显示 100100 以内的随机整数  注意: srand() 函数就不能往 for 里面放,只能放 BEGIN 后面!

字符串处理:

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(/:/,”-“,$1)’

split(s,array,[r]) :以 r 为分隔符,切割字符串 s ,并将切割后的结果保存至 array 所表示的数组中,第一个索引值为 1, 第二个索引值为 2,…

netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);conut[ip[1]]=conut[ip[1]]+1}

END{for(i in conut){print i,count[i]}}’

例如 head -n1 /etc/passwd | awk ‘{split($0,arr,”:”)}END{for(i in arr){print i,arr[i]}}’

第八周总结

awk 函数

自定义函数

格式:

function 函数名 (参数 1 ,参数 2.. 参数 N{

语句

return 表达式

}

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  显示的是 3

或者

cat fun.awk

function max(v1,v2) {

v1>v2?var=v1:var=v2

return var

}

BEGIN{print max(a,b)}

awk -v a=100 -v b=200–f fun.awk  显示的是 200

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

或者 vim 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 参数(建议都加 -v 选项, -v 具有通用性)

示例:

cat test.awk

#!/bin/awk –f

{if($3 >=min && $3<=max)print $1,$3}

chmod +x test.awk

test.awk -F: -v min=100 -v max=200 /etc/passwd

练习:提取出字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字

echo “Yd$C@M05MB%9&Bdh7dq+YVixp3vpw” | awk ‘gsub(/[^0-9]/,””,$0)’ 或者

echo “Yd$C@M05MB%9&Bdh7dq+YVixp3vpw” | awk ‘gsub(/[^[:digit:]]/,””,$0)’

注意:正则表达式里排除数字 [^0-9] 或者 [^[:digit:]][^[0-9]] 写法错误

练习

解决 DOS 攻击生产案例:根据 web 日志或者或者网络连接数,监控当某个 IP

并发连接数或者短时内 PV 达到 100 ,即调用防火墙命令封掉对应的 IP ,监控频

率每隔 5 分钟。防火墙命令为: iptables -A INPUT -s IP -j REJECT

并发连接数使用 netstat -nt 查看,通过 web 日志是使用命令

cat /var/log/httpd/access_log

本文来自投稿,不代表 Linux 运维部落立场,如若转载,请注明出处:http://www.178linux.com/98994


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

世界是平的

世界是平的

[美] 托马斯·弗里德曼 / 何帆、肖莹莹、郝正非 / 湖南科学技术出版社 / 2006-11 / 56.00元

当学者们讨论世界这20年发展的历史,并把目光聚集在2000年到2004年3月这一段时间时,他们将说些什么?9·11恐怖袭击还是伊拉克战争?或者,他们将讨论:科技的汇集与传播使得印度、中国和许多发展中国家成为世界商品和服务产品供给链上的一员,从而为世界大的发展中国家中的中产阶级带来了大量的财富,使这两个国家在全球化浪潮中占据更有利的位置?随着世界变得平坦,我们必须以更快的速度前进,才能在竞争中赢得胜......一起来看看 《世界是平的》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具