谢烟客---------Linux之Aho Weinberger Kernighan

简介:

工作模式,类似cut功能,

wKioL1m5K27gmyzzAABRuEsxdiY222.png

wKiom1m50UvhVkgDAAB7BsGSWQo319.png

wKioL1m50SHBznafAAB8tnsJFeM192.png

wKiom1m50UvAQJN2AAB9rdvQkL8379.png



与sed区别
1、格式

wKioL1m51LTymMxPAAAQEejcduo502.png

2、PATTERN

wKiom1m51SOTw6w2AAATrBlT8ag608.png

wKiom1m51iPyiZUjAAAYlb4tXSI235.png

wKiom1m51r7A8XvAAAAPx4yS46A797.png

wKiom1m52B_Cdr__AABDbgqs-rI881.png

wKiom1m52uLhQQPnAAAzN8t2rFk895.png

wKiom1m5242BChhAAAA16sjwe_A895.png


awk基本格式:

awk [OPTION...] 'PATTERN{ACTION STATEMENT;ACTION STATEMENT;...}' FILE1 FILE2 ...

OPTION:

    -F '' 指明分隔符

    -v var="value" 定义变量

PATTERN:定义读入哪些行时对行处理

ACTION: 对行如何处理,文本格式化输出:print,printf

1
多个语句间用 ;


1、变量

内建变量

wKiom1m5O_LCj4q1AAAX-yAsoIU007.png

wKioL1m5O8mTyKdaAAAWRyeU204607.png

wKiom1m5O_PwzrcaAAAOhx8-uMs464.png

wKiom1m5O_PTvN-gAAAO9vry7Gk113.png

wKioL1m5O8nDEmwgAAAWQdQmS_U497.png

wKioL1m5O8qQyg32AAAXxtOtxtQ289.png

wKiom1m5O_OhdYXwAAAWdxdqr_0902.png

wKiom1m5O_TxoDqmAAAQjQbI-qs626.png

wKioL1m5O_7AlT5xAAATSBHePBQ500.png

wKioL1m5O__B2-E9AAAXnHVzJoQ203.png


自定义变量

wKioL1m5PD7geF5ZAAAX_Rlrcnc416.png


变量应用注意

wKiom1m52ZaR-C3iAAATPuJkA20312.png


2、ACTION

print

wKioL1m5PM3AQ32ZAAA7V3jg3S8671.png

printf

wKioL1m5PiOxIMXCAAC2AFLtqMM393.png


3、操作符

wKioL1m5Pp_Q3M6cAAAmQmDnIbY928.png

wKiom1m5PrnxjqQyAAAvONOQYGw505.png

wKiom1m5P4PSxWsGAABdT9H_mCY541.png


4、PATTERN定界:'PATTERN{ACTION STATEMENT}'

wKioL1m54HKBpFclAAAZDLCqtrI578.png

wKiom1m54Jyyy5jqAAAbtV5Epbs962.png

wKioL1m54HLAmLRfAAARe_s4Itw444.png

wKiom1m54J2C179XAAA0YTk3tNI513.png

wKioL1m54HOR1paGAAAbknCbA80348.png

wKiom1m54J2xd8TQAAAa9OCgxfI017.png

wKioL1m54HSArFKOAABjUFrS39U185.png


5、ACTION

wKioL1m54PHTILyuAAAoxPTOdrY597.png

wKioL1m54RqDlOrfAABE6HVfSJM312.png


5.1 if-else awk取得的行进行字段判断

1
2
if  (condition) { true -statement} 或   if  (condition)  true -statement
if  (condition) { true -statement}  else  { false -statement}

id号大于1000为普通用户

最后一个字段的行/bin/bash结尾

字段数大于5个,显示行,否则不显示

显示文件系统使用结果>80则显示


1
2
3
id 号大于1000为普通用户
# awk -F ':' '{if ($3>500){print $1,$3}}' /etc/passwd
# awk -F ':' '{if ($3>500){printf "%15s %-d\n",$1,$3}}' /etc/passwd
1
2
3
最后一个字段的行/bin/bash结尾
# awk -F  ':'  '{if ($NF == "/bin/bash"){print $1,$3}}'  /etc/passwd
# awk -F  ':'  '{if ($NF ~ /\<bash$/){print $NF}}'  /etc/passwd
1
2
字段数大于 5 个,显示行,否则不显示
# awk -F  ':'  '{if (NF>5){print $0}}'  /etc/passwd
1
2
显示文件系统使用结果> 80 则显示
# df -hP | awk -v FS= "%"  '!/^File/{print $1}'  | awk  '{if ($NF>80){print $1}}'


5.2 while  对一行内的多个字段逐一处理时使用,对数组中各元素逐一处理时使用

1
2
3
4
5
while  (condition) { true -statement}
(condition) 判断条件
  { true -statement} 条件为真时,执行循环体
 
length(arg1,arg2,...) 显示字段的长度

对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数

对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数


对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数

1
2
3
4
# awk  '{i=1;while (i<=NF){print $i,length($i);i++}}'  /etc/fstab
 
思路: awk  '{print length($i)}'  FILE
i表示每个字段即可


对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数

1
2
3
# awk  '{i=1;while (i<=NF){if (length($i)>5)print $i,length($i);i++}}'  /etc/fstab 
 
循环嵌套 if 条件判断


5.3 do-while循环

1
2
do  { true -statement}  while  (condition)
至少执行一次循环体
1
# awk  '{i=1;do {print $i,length($i);i++} while (i<=NF)}'  /etc/issue


5.4   for 循环

1
2
for  (控制变量初始化;控制变量条件表达式;控制变量的修正表达式) {statement}
for  ( var iable assignment;condition;iteration process) { for -body}

对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数

对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数


对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数

1
2
3
4
5
6
7
8
显示模式匹配到的行
# awk  '/^[[:space:]]+/{print}'  /etc/grub.conf
 
用I表示每个字段
# awk  '/^[[:space:]]+/{print length($i)}'  /etc/grub.conf 
 
套入循环格式 ,在循环体中要对I值进行修正
# awk  '/^[[:space:]]+/{i=1;while (i<=NF){print $i,length($i);i++}}'  /etc/grub.conf


对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数

1
2
循环体中嵌套单分支 if 语句 ,单分支 if 的statement的{} 可省略
# awk  '/^[[:space:]]+/{i=1;while (i<=NF){if (length($i)>=10)print $i,length($i);i++}}'  /etc/grub.conf


5.5 switch语句 多分支if

1
2
switch  (expression) ( case  VALUE1 or /REGEXP1/:statement; case  VALUE2 or /REGEXP2/:statement;...;  default :statemet)
表达式 == value1 或 表达式 ~ /REGEXP1

》》》


5.6 break [n] 或 continue

1
2
显示奇数字段
# awk -F  ':'  '{i=1;while (i<=NF){if (i%2==0) {i++;continue} else {print i,$i;i++}}}'  /etc/passwd


5.7 next 提前结束本行处理

1
2
显示以/bin/bash结尾的行,非/bin/bash结尾的行next
# awk -F  ':'  '{if ($NF != "/bin/bash"){next} else {print $0}}'  /etc/passwd
1
2
显示用户id号为偶数的用户
# awk -F  ':'  '{if ($3%2 != 0){next} else {print $0}}'  /etc/passwd


6、数组

wKioL1m57wGRCsIVAABH94izTmA928.png

wKiom1m574DQl3EtAAALKKWV16E484.png

1
2
显示第一个元素
# awk  'BEGIN{weekdays["mon"]="Monday";weekdays["thu"]="Thuseday";print weekdays["mon"]}'


wKiom1m58e7C5tx1AAAXvzl33Cc804.png

统计netstat状态

统计日志IP

统计/etc/fstab文件中每个单词出现的次数

统计文件系统出现的次数

1
2
3
4
5
6
统计netstat -tnl 中的状态
 
1 )查看所有状态
netstat -tan | awk  '{print $NF}'
 
2 )# netstat -tan | awk  '{state[$NF]++}END{for (i in state){print i,state[i]}}'
1
2
3
4
5
6
7
8
9
10
统计日志
 
1 )查看httpd是否被安装
rpm -q httpd
2 ) 启动httpd
service httpd start
3 )httpd自带压力测试工具,ab
ab -c  100  -n  1000 
4 )统计日志IP
# awk  '{count[$1]++}END{for (i in count){print i,count[i]}}'  / var /log/httpd/access_log

1
2
3
统计/etc/fstab文件中每个单词出现的次数
# awk  '{i=1;while (i<=NF){count[$i]++;i++}}END{for (i in count){print i,count[i]}}'  /etc/fstab
# awk  '{for(i=1;i<=NF;i++){count[$i]++}}END{for (i in count){print i,count[i]}}'  /etc/fstab
1
2
3
统计文件系统出现的次数
# awk  '{print $3}'  /etc/fstab 
# awk  '{count[$3]++}END{for (i in count){print i,count[i]}}'  /etc/fstab


7、函数

wKiom1m585_x156HAAARyYvBxsw151.png

wKiom1m59I2icVoBAAB_oXOBdAY332.png

统计每一个ip建立ip的个数

1
2
统计每一个ip建立ip的个数
# netstat -tnl | awk  '!/^Proto/ && !/^Active/{split($5,state,":");ip[state[1]]++}END{for (i in ip){print i,ip[i]}}'









本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1965174,如需转载请自行联系原作者
目录
相关文章
|
2天前
|
安全 Linux 测试技术
|
2天前
|
安全 Linux Windows
Linux中Shutdown命令使用介绍
Linux中Shutdown命令使用介绍
|
3天前
|
缓存 关系型数据库 Linux
Linux目录结构:深入理解与命令创建指南
Linux目录结构:深入理解与命令创建指南
|
3天前
|
数据挖掘 Linux vr&ar
Linux命令实战:解决日常问题的利器
Linux命令实战:解决日常问题的利器