码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2017-09-14 18:56:49      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:linux   博客   运维   游戏   it   


工作模式,类似cut功能,

技术分享

技术分享

技术分享

技术分享



与sed区别
1、格式

技术分享

2、PATTERN

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享


awk基本格式:

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

OPTION:

    -F ‘‘ 指明分隔符

    -v var="value" 定义变量

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

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

多个语句间用 ;


1、变量

内建变量

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享


自定义变量

技术分享


变量应用注意

技术分享


2、ACTION

print

技术分享

printf

技术分享


3、操作符

技术分享

技术分享

技术分享


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

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享


5、ACTION

技术分享

技术分享


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

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

id号大于1000为普通用户

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

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

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


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
最后一个字段的行/bin/bash结尾
# awk -F ‘:‘ ‘{if ($NF == "/bin/bash"){print $1,$3}}‘ /etc/passwd
# awk -F ‘:‘ ‘{if ($NF ~ /\<bash$/){print $NF}}‘ /etc/passwd
字段数大于5个,显示行,否则不显示
# awk -F ‘:‘ ‘{if (NF>5){print $0}}‘ /etc/passwd
显示文件系统使用结果>80则显示
# df -hP | awk -v FS="%" ‘!/^File/{print $1}‘ | awk ‘{if ($NF>80){print $1}}‘


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

while (condition) {true-statement}
(condition) 判断条件
 {true-statement} 条件为真时,执行循环体

length(arg1,arg2,...) 显示字段的长度

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

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


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

# awk ‘{i=1;while (i<=NF){print $i,length($i);i++}}‘ /etc/fstab

思路: awk ‘{print length($i)}‘ FILE
i表示每个字段即可


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

# awk ‘{i=1;while (i<=NF){if (length($i)>5)print $i,length($i);i++}}‘ /etc/fstab 

循环嵌套if条件判断


5.3 do-while循环

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


5.4   for 循环

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

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

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


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

显示模式匹配到的行
# 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才显示字段内容和字段中包含的字段的个数

循环体中嵌套单分支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

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

》》》


5.6 break [n] 或 continue

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


5.7 next 提前结束本行处理

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


6、数组

技术分享

技术分享

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


技术分享

统计netstat状态

统计日志IP

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

统计文件系统出现的次数

统计netstat -tnl 中的状态

1)查看所有状态
netstat -tan | awk ‘{print $NF}‘

2)# netstat -tan | awk ‘{state[$NF]++}END{for (i in state){print i,state[i]}}‘
统计日志

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

统计/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
统计文件系统出现的次数
# awk ‘{print $3}‘ /etc/fstab 
# awk ‘{count[$3]++}END{for (i in count){print i,count[i]}}‘ /etc/fstab


7、函数

技术分享

技术分享

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

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


本文出自 “Reading” 博客,请务必保留此出处http://sonlich.blog.51cto.com/12825953/1965174

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

标签:linux   博客   运维   游戏   it   

原文地址:http://sonlich.blog.51cto.com/12825953/1965174

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!