摘要:awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 awk的确拥有自己的语言:awk程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
同时,awk又是linux环境下的一个命令行工具,由于awk强大的能力,可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,所以称其为Awk语言。一般使用awk来做什么,awk又适合做什么工作呢?由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,可以将这个文件看成是由很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。
一、命令行格式
awk 'BEGIN{ commands } pattern{ commands } END{ commands }' file
说明:其中options表示awk的可选的命令行选项,其中最常用的恐怕是-F,它指定将文件中每一行分隔成列的分隔符号。而紧接着后面的单引号里面的所有内容是awk的程序脚本,awk需要对文件每一行分割后的每一列做处理。最后的file则是awk要处理的文件名称。
格式解读如下:
awk [-F|-f|-v] 'BEGIN{} //{command1; command2} END{}' file
1、[-F|-f|-v]:-F指定分隔符,-f调用脚本,-v定义变量
2、'':引用代码块
3、BEGIN:初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符。
4、//:匹配代码块,可以是字符串或正则表达式
5、{}:命令代码块,包含一条或多条命令
6、;:多条命令使用分号分隔
7、END:结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息。
8、File:需要处理的文件名称
二、正确理解命令行格式
1、-F指定分隔符
awk -F":" '{print $1}' /etc/passwd //以符号 : 分隔。打印第一列
awk -F":" '{print $1 $3}' /etc/passwd //$1与$3相连输出,不分隔
awk -F":" '{print $1,$3}' /etc/passwd //多了一个逗号,$1与$3使用空格分隔
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd //自定义输出
awk -F: '{print NF}' /etc/passwd //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd //将每行第NF个字段的值打印出来
awk -F: 'NF==7 {print }' /etc/passwd //显示只有7个字段的行
awk '{print NR,$0}' /etc/passwd //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==18{print}' /etc/passwd //显示第18行
awk -F: 'NR==1 || NR==16{print}' /etc/passwd //显示第1行和第16行
route -n|awk 'NR!=1{print}' //不显示第一行
2、-f指定脚本文件
执行#vim script.awk编写如下程序
执行# awk -f script.awk /etc/passwd指令。如下图
3、-v指定变量
说明:使用变量apple并对该变量进行赋值,当值为13时,打印apple13。
4、print 打印指定内容
awk '{print}' /etc/passwd == awk '{print $0}' /etc/passwd
awk '{print " "}' /etc/passwd //不输出passwd的内容,而是输出相同个数的空行
awk '{print "a"}' /etc/passwd //输出相同个数的a行,一行只有一个a字母
awk -F: '{print $1; print $2}' /etc/passwd //将每一行的前二个字段,分行输出
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd //输出字段1,3,6,以制表符作为分隔符
5、if语句
使用说明:if语句必须用在{}中,且比较内容用()扩起来。如下图
6、while语句
使用说明:用while循环语句计算1至100的数相加的值。如下图
三、AWK使用实例
1、统计/etc/passwd的账户人数
执行指令39;{count++;print $0;} END{print "user count is ", count}' /etc/passwd。如下图
2、统计系统中的secure文件中谁在远程登录服务器
执行指令39;/sshd/{print $(NF-3)}' secure-20220605 |sort |uniq -c |sort -nk1
3、统计netstat -anp 状态为LISTEN和CONNECT的连接数量
执行指令39;$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum}'
本文【awk命令取出某一行某一列_awk截取某列中某个字段】由作者: 主键 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4155.html