博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谢烟客---------Linux之Aho Weinberger Kernighan
阅读量:7008 次
发布时间:2019-06-28

本文共 3989 字,大约阅读时间需要 13 分钟。

工作模式,类似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
多个语句间用 ;

1、变量

内建变量

自定义变量

变量应用注意


2、ACTION

print

printf

3、操作符

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

5、ACTION

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、数组

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

统计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、函数

统计每一个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,如需转载请自行联系原作者
你可能感兴趣的文章
POJ 1182 食物链 【带权并查集/补集法】
查看>>
V字形
查看>>
Flask学习笔记(3)-数据库迁移
查看>>
Hbase常用操作
查看>>
一行命令学会全基因组关联分析(GWAS)的meta分析
查看>>
第二阶段冲刺——six
查看>>
模块封装代码
查看>>
《Machine Learning》(第一章)序章
查看>>
【右键禁用U盘的小技巧】
查看>>
执行sql语句后的数据处理api
查看>>
jquery $.each的用法
查看>>
Python --元组与列表的差异
查看>>
PHP TP增删改
查看>>
VMware虚拟机与主机联通及配置上网
查看>>
single-row function和muti-row function
查看>>
keepalived
查看>>
意向锁
查看>>
线性规划
查看>>
常见错误分析-笔记
查看>>
P1256 显示图像(广搜)
查看>>