扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一次读取一行文本,按输入分隔符进行切片,切成多个组成部分,将每片直接保存在内建的变量中,$1,$2,$3....,引用指定的变量,可以显示指定段,或者多个段。如果需要显示全部的,需要使用$0来引用。可以对单个片段进行判断,也可以对所有段进行循环判断。
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的西城网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
其默认分隔符为空格
awk [options] 'program' FILE......
[options]说明
主要有两种模式
1、 awk [options] 'scripts' file1,file2.....
在这种模式中,scripts主要是命令的堆砌,命令之间用 分号 分割;对输入的文本行进行处理,通过命令 print,printf 或是输出重定向的方式显示出来,这里经常用到的知识点是:awk的内置变量,以及命令print和printf的使用
2、 awk [options] 'PATTERN{action}' file,file2.....
在这种模式中,最重要的是5种模式和5种action的使用,以及awk的数组的使用和内置函数
其格式化输出: printf FORMAT,item1,item2....
例子: awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt
格式符
修饰符
输出重定向
awk [option] 'PATTERN{action}' file1,file2....
Linux三剑客awk命令篇二:命令操作符
关于awk的原理等基本知识请参考上篇:
Linux三剑客awk命令篇一:原理及基本命令
补充
1、语法格式:
(1) Awk完整语法
awk 'BEGIN{commands} pattern{commands}END{commands} ' file
BEGIN{commands}:处理数据前执行的命令。
END{commands}:处理完数据后执行的命令。
这两个命令可以省略。见(2)
(2) Awk基本语法
awk -F '分割符' '/模式/{动作} ' file
这里的 '/模式/{动作} ' 类似于sed的命令格式。
模式:
(1) 正则表达式(注意格式: /正则表达式/ )
(2) 条件表达式(例如: 等等)
总结:
这里的模式通俗来讲是 用来找谁, 而动作表示是 干啥。
2、 awk的命令操作符
(1) 正则表达式与bash一致
(2) + - * / % ++ --
(3) || !
(4) = = != == ~ !~
~:表示匹配后面的模式,用于字段,见 案例1 。
其余的都比较常见就不举例了。
3、案例
案例1:
~使用案例
awk -F : '$3 ~ /\...\/{print $1,$3}' /etc/passwd
解释:
模式:\...\
\ \表示定界符,只匹配3个字符。
$3 ~:表示$3这个字段必须符合后面模式(\...\)的要求。
见如下输出结果,$3都是3个字符。
案例2:
% || ==使用案例
seq 100 | awk '$1 % 7 == 0 || $1 ~ /^99/{print $1}'
输出结果的要求:
整除7或者以99开头
案例3:
++使用
awk 'BEGIN{num=0}{num++}END{print num}' /etc/passwd
简单解释:
BEGIN{num=0}:定义一个变量num
{num++}:这里没有模式,只有动作。
即每匹配到文件/etc/passwd的一行就执行num++
END{print num}:文件遍历结束,打印num的值,即文件的行数。
这里我们使用wc -l验证也是没问题的。
cat /etc/passwd | wc -l
上面3个案例简单的使用了awk的命令操作符。
虽然只是用到了几个简单的,但是其他同理,大家可以执行操作。
下一篇:
Linux三剑客awk命令篇二之内部变量
欢迎大家给予宝贵的意见或者建议。
欢迎大家补充或者共享一些其他的方法。
感谢支持。
一、awk if分支结构
二、awk数组 for循环
一、awk if分支结构
案例1
awk过滤中的if分支结构
1)单分支
统计/etc/passwd文件中UID小于或等于1000的用户个数:
统计/etc/passwd文件中UID大于1000的用户个数:
统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数:
2)双分支
分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数:
分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:
二、awk数组
注意,awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号:
案例3:awk扩展应用
1)awk统计Web访问排名
在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。
针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序
实现此案例需要按照如下步骤进行。
步骤一:统计Web访问量排名
分步测试、验证效果如下所述。
1)提取IP地址及访问量
2)对第1)步的结果根据访问量排名
案例4:编写监控脚本
本案例要求编写脚本,实现计算机各个性能数据监控的功能,具体监控项目要求如下:
CPU负载
网卡流量
内存剩余容量
磁盘剩余容量
计算机账户数量
当前登录账户数量
计算机当前开启的进程数量
本机已安装的软件包数量
步骤
实现此案例需要按照如下步骤进行。
步骤一:准备工作
1)查看性能数据的命令
步骤二:编写参考脚本
1)脚本内容如下:
我使用awk命令时,用的次数最多的是 从stdin或文件里选取几列输出 。
awk的print语句:
很久之前,在python celery文档里见过下面的这个命令,正是因为当时看不懂这个命令,才开始浅学awk和xargs。
awk是一个强大的文本分析工具,与grep、sed相比,awk在对数据分析并生成报告时,显得有很大的优势。
awk有三个不同的版本:awk、nawk和gawk,在没有做特殊说时的时候默认的就是gawk,gawk是awk的GNU版本。
其中command是真正的awk命令,-F表示域的分隔符,是个可选项。Filename是等待处理的文件
将所有的awk命令写入到一个文件,并使用该文件有X权限,然后awk命令解释器作为脚本的首行,也就是说可以把脚本最开始的 #!/bin/bash 换成 #!/bin/awk
最后直接执行这个脚本文件就行了。
-f 指定要加载的awk脚本,是一个文件。Filename是等待处理的文件
awk的工作流程是这样的:读入一行后(最后面带有” ”的),就按-F指定的分隔符来将该行划分成N个区域,$0表示所有的区域,$1表示第一个域,$2表示第二个域,依此类推,$n表示第n个域。
总结:awk先执行BEGIN内的命令,然后再读入文件中的行,接着就是按照指定的分隔符将该行分成N个区域,然后再来执行模式所对应的动作action。然后,再来读入第二行。。再重复执行action,直到所有的行都处理完成。最后再执行END中的命令。
注意:' // '之间是支持正则表达式的,如果此处只有pattern,而没有action,那么awk默认会把匹配到的行打印出来。
awk中的print还可以使用C语言中的printf来替代。在输出格式比较复杂的时候使用printf函数会比print函数要更直观一些,如下:
还可以使用-v key=value来自定义变量。如下:
awk中的条件语句是从C中借鉴过来的
语法:if (condition) {then-body} else {else-body}
例如使用awk来统计某个目录下的普通文件的大小,不包括子目录的,并过滤掉目录。
循环语句也和C中的一样,支持while、do/while、for、continue、break等关键字。
break和continue常用于循环中;
在awk中,数组的下标可以是数字或字母。一般awk中的数组的作用是从记录中收集信息,用于计算总和、统计单词等。
在awk中要删除一个元素的时候使用 delete array[index]
更多请参见awk官方文档[]
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。
之所以叫awk是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family
Name的首字符。
awk格式:
格式: sed -n '3p' sed.txt
找谁干啥(条件动作)
awk格式
#取出/etc/passwd 第1行的第1列和第3列
awk -F: 'NR==1{print $1,$3}' /etc/passwd
awk 选项 '条件{动作}' /etc/passwd
条件: 哪一行,过滤什么内容
动作: print输出与显示 ,计算....
awk取行:与sed类似
案例01:取出sed.txt的第2行
[root@oldboy81-golden-lnb /oldboy]# cat sed.txt
101,oldgirl,CEO
102,zhangya,CTO
103,lidao007,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk 'NR==2' sed.txt
102,zhangya,CTO
#awk '行号 等于 2' sed.txt
#NR awk内置变量
Number of Record 记录号(行号)
案例02:取出sed.txt中包含oldboy或lidao的行
[root@oldboy81-golden-lnb /oldboy]# sed -rn '/oldboy|lidao/p' sed.txt
103,lidao007,COO
110,lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk '/oldboy|lidao/' sed.txt
103,lidao007,COO
110,lidao,COCO
案例03:取出文件第2行到第5行内容
#awk '行号大于等于2 并且 行号小于等于5' sed.txt
#方法01
awk 'NR=2 NR=5' sed.txt #必会
表示并且.
#方法02
sed -n '2,5p' sed.txt
#方法03 了解
awk 'NR==2,NR==5' sed.txt #从行号是2的行开始 到 行号是5的行结束( 了解)
案例04:取出文件第3行到最后一行内容
[root@oldboy81-golden-lnb /oldboy]# awk 'NR = 3' sed.txt
103,lidao007,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# sed -n '3,$p' sed.txt
103,lidao007,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
案例05:取出从包含oldboy的行到lidao的行
[root@oldboy81-golden-lnb /oldboy]# cat sed.txt
101,oldgirl,CEO
102,zhangya,CTO
103,lidao007,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
root@oldboy81-golden-lnb /oldboy]# sed -n '/old/,/lidao/p' sed.txt
101,oldgirl,CEO
102,zhangya,CTO
103,lidao007,COO
[root@oldboy81-golden-lnb /oldboy]# awk '/old/ , /lidao/' sed.txt
101,oldgirl,CEO
102,zhangya,CTO
103,lidao007,COO
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流