专业编程基础技术教程

网站首页 > 基础教程 正文

Linux系统基础指令(四)——awk命令

ccvgpt 2025-04-01 16:18:21 基础教程 4 ℃

摘要:awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 awk的确拥有自己的语言:awk程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

同时,awk又是linux环境下的一个命令行工具,由于awk强大的能力,可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,所以称其为Awk语言。一般使用awk来做什么,awk又适合做什么工作呢?由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,可以将这个文件看成是由很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。

Linux系统基础指令(四)——awk命令

一、命令行格式

awk [options] '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的账户人数

执行指令# awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd。如下图

2、统计系统中的secure文件中谁在远程登录服务器

执行指令# awk '/sshd/{print $(NF-3)}' secure-20220605 |sort |uniq -c |sort -nk1

3、统计netstat -anp 状态为LISTEN和CONNECT的连接数量

执行指令# netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'

Tags:

最近发表
标签列表