linux 文本三剑客之awk

awk简介



awk同sed、grep被称为linux文本处理三剑客,都起源于行编辑器ed。awk继承了行编辑器的特点,循环的读取文本的每一行(或者是分隔符分割的每一段文本)直至文本结束,但是awk加入了段分割符的概念.将每次读入的行进行再次分割.awk每次读取的行都只是未经过awk语句处理的对象。或读取行后会根据段分割符在将行分成多个对象。结构近似数组,然后进行指定语句的操作。作为一款报表生成器,作用是对对文本内容进行各种排版,进而格式化显示。

awk有自己的语法,可以说是一款独立的编程语言。 它对命令的处理可以称为命令的解释,或脚本语言的解释 awk的语句书写格式,属于模块化风格,特别是if,else语句表现的特别明显有点类似于bash中的匿名函数。每个语句块必须使用{}进行约束。

本文介绍了awk的常用用法及讲解并添加示例以便加深理解,结尾准备了实战练习以加强巩固,请读者自行按需阅读,如有纰漏望请指出。

1、awk基本执行流程

2、awk基本格式

3、printf 用法及格式符、修饰符

4、awk中的控制语句

5、awk中的函数、变量及操作符

6、实战练习



1、awk基本执行流程

①执行BEGIN语句块中的内容,语句为可选语句.多用于执行变量的初始化,报表的头输出.

②从标准输入或文件中读取行分割符(-F定义的字符)分割的行进入内存,进行语句之前的条件匹配,在没有条件时默认为符合执行条件.符合条件执行,不符合条件则尝试匹配下一个语句之前的条件.直至所有条件匹配全部完成.当语句为空时默认执行{print $0}

③继续读取下一行,直至末尾

④执行END定义的语句内容,同样也为可选语句.多用于报表的统计信息输出.

2、awk基本格式及匹配条件

    基本格式: awk选项 条件 语句 文件

选项:

-f 从文件中读取处理命令
-F 指明行的段分隔符;默认为空白字符(一个或多个)
-v 自定义变量

条件

条件为执行条件后的语句的要求。符合条件才可执行语句,条件即为对语句的判断,可以使用正则匹配,基于正则的模式定界,字符串比较,可以使用算数条件表达式,也可以是BEGIN,END特殊条件。

算数条件表达式,最终返回运算结果,当运算结果为0时,语句不执行。当语句为空时,默认执行{print $0}。

例:正则_匹配正则匹配的每一行

awk ‘/^UUID/{print $1}‘/etc/fstab
匹配以UUID为开始的行,并执行{}中的语句。print $1
awk ‘!/^UUID/{print $1}‘ /etc/fstab
匹配以非UUID为开始的行,执行{}中的语句 。print $1

例:算数计算_条件为真该行才会被处理 ,条件 为假则不处理 。

awp -F: ‘$3>=1000{print $1,$3}‘ /etc/passwd
awp -F: ‘!$3>=1000{print $1,$3}‘ /etc/passwd
awk -F:‘(NR>=2&&NR<=10){print $1}‘

例:字符串比较_比较结果为真进入循环

awk -F:‘$NF="/bin/bash"{print $1,$NF}‘ /bin/passwd
awk -F:‘$NF~/bash$/{print $1,$NF}‘ /bin/passwd
awk -F: ‘! ($NF=="/bin/bash")‘ /etc/passwd

例:行范围_范围内的行做处理 ,只支持模式定界(类似sed中的10,20地址定界不支持)

awk -F:‘/^root/,/^myuser/{print $1}‘

例:特殊条件_BEGIN/END

BEGIN:在开始之前显示一次  
END:在文本处理完成 ,命令未完成时,执行一次 
awk ‘BEGIN{print "usernameID\n------------"}{printf "%10s:%-s" $1,$3}END{print "=========\n"}‘

例:特殊条件0,空。

awk -v aa="" ‘aa‘ /etc/passwd
变量aa的值为空 ,(语句为空执行默认语句)。但是条件为空,不执行默认语句。
awk -v aa=" " ‘aa‘ /etc/passwd
变量aa的值为‘ ’空格不为空执行默认语句
awk -v aa="0" ‘aa‘ /etc/passwd
变量aa的值为0,条件为最终值为0,默认语句不执行。
awk ‘!arr[$0]++’ dupfile 
以$0为下标建立数组,只打印文件不重复的行
awk -v aa=0 ‘aa++‘ /etc/passwd
aa初始值为0,第一条语句条件为a++,首先返回a的值在进行自加运算。所以打印第一行外所有行。awk中
默认对非关键字变量都赋值0,这个例子也可以写成
awk  ‘aa++‘ /etc/passwd    打印效果相同。


3、printf 用法及格式符、修饰符

print类似bash中的echo打印给定字符并自动添加换行这里不多说,printf对输出格式可以自定义,用法需要大家注意。

语法:printf FORMAT,item1,item2,...

①必须提供FORMAT

②printf不会自动换行,若想换行需加换行符:\n

③FORMAT中需要依次分别为后面每一个item指定一个格式符,否则item不显示。

格式符:

%c :   显示字符的ascii码
%d或i: 显示十进制整数  
%e或%E:科学记数法显示数值
%f:    显示浮点数  
%s:    显示字符串
%% :   显示%自身 
%g或%G:以科学计算法或浮点数格式显示数值 
%u:    无符号的整数

修饰符:

#[.#]:左边#用于显示宽度
       右边的#表示小数点后的精度 
- : 左对齐,默认右对齐。
+ :  显示数字的正负符号


4、awk中的控制语句

(1)、条件表达式

格式:条件?条件为真的语句:条件为假的语句

例:

awk -F:‘{$3>=500?usertype="common":usertype="sysadmin";printf "%15s:%-s\n",$1,usertype}’
/etc/passwd

(2)、if-else

格式:

if(条件){语句}
if(条件){语句} else {语句}

例:

awk -F: ‘{if($3>1000) print $1,$3}‘ /etc/passwd
awk -F: ‘{if($3>1000){printf "普通用户:%s",$1} else {printf "系统用户:%s",$1}}‘

(3)、while循环

while (条件) {语句}
条件为真进入循环 ,条件为假退出循环。

例:

awk ‘/^[[:space:]]*linux/{i=1;while(i<NF){print $i,length($i);i++}}‘ /etc/grub2.cfg
awk ‘/^[[:space:]]*linux/{i=1;while(i<NF){if(length($i)>7){print $i,length($i)};i++}}‘ /etc/grub2.cfg

(4)、do-while循环

do{语句} while(条件)

首先执行do后面的语句。然后对while中的条件进行判断。条件符合继续执行do后的语句。至少执行一次循环。

(5)、for循环

语法:for(expr1;expr2;expr3){statements}

例:

awk /[[:space:]]*linux/{for(i=1;i<=NF;i++){print $i,length($i)}} /etc/grub2.cfg

for可以实现遍历数组元素 :

格式 :for (i in 数组名称)遍历时 i被赋值的是每个索引


5、awk中的函数、变量及操作符

函数:分为内建函数和自定义函数

内建函数:

数值处理:rand()与srand() 组合使用返回一个0至1之间的随机数。

字符串处理:

length([s]):统计指定字符串的长度,并返回。

sub(r,s[,t]):处理字符串t(可以是单纯的字符串,变量,位置引用),对t进行模式匹配,模式定义在r中,将模式r所匹配的内容替换成s中的内容,但是只进行1次替换

例:echo "2008:08:08:08 08:08:08:08" |awk ‘sub(/:/,"-",$0)‘

gsub (r,s,[t]):处理字符串t(可以是单纯的字符串,变量,位置引用),对t进行模式匹配,模式定义在r中,将模式r所匹配的内容替换成s中的内容,对于待处理的字符串t进行全局替换。

例:echo "[email protected]%9&Bdh7dq+YVixp3vpw"|awk ‘{gsub(/[^0-9]/,"",$0);print $0}‘

split(a,array,[r]):以r为分隔符,分割字符串a,并将分割后的字符串分别存入数组,数组的下标从1开始,第一个索引为1,第二个索引为2.

例:netstat -tan |awk ‘/^tcp/{split($4,ip,":");a[ip[1]]++}END{for(i in a){print i,a[ip[1]]}}‘

int:将指定的内容转换为整数类型

自定义函数

格式:

function 函数名称 (参数1 ,参数2 。。。){
语句1
语句2
return 数值
}

例:

#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}


变量:分为内建变量和自定义变量

内建变量:

FS:输入的字段分割符,默认为空白字符

OFS:输出的字段分隔符,默认也为空白字符。

RS:输入时指明的行分割符,默认就是换行符,

ORS:输出时的行分隔符,默认为换行符

NF :行中的字段数量

NR :行计数器 ,如果跟了多个文件编号会连续

FNR : 行数,各文件单独计数 。

FILENAME : 当前的文件名

ARGC :命令行中的参数个数(awk也算一个参数)

ARGV :命令行中的参数 ,ARGV为数组,参数为命令自身及后跟随的文件 ,语句不计入参数

自定义的变量

-v var=value

在语句中直接定义,多条与语句之间使用 ;分隔,每定义一个变量需要一个-v。

操作符 

算数操作符 :实现算数运算x+y x-y x*y x/y x^y x%y

-x :将x 转化为负数

+x :将字符串x 转化为 数值

赋值操作符 :通常为变量赋值

= += -= *= /= ^= %=

++  --

比较操作符:> >= < <= != ==

模式匹配操作符:根据右侧的模式进行匹配操作

~ : 是否由右侧模式匹配

!~:是否由右侧模式不匹配

逻辑操作符 :进行逻辑的运算与bash脚本中用法不同

&& :并且

|| :或者

!:非



6、awk实战练习

(1)、统计/etc/fstab文件中每个文件系统类型出现的次数

awk ‘!/^#/{arr[$3]++}END{for(i in arr){print i,arr[i]}}‘ /etc/fstab

(2)、提取出字符串[email protected]%9&Bdh7dq+YVixp3vpw中的所有数字

echo "[email protected]%9&Bdh7dq+YVixp3vpw"|awk ‘gsub(/[^0-9]/,"",$0)‘

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

awk ‘{i=1;while(i<=NF){word[$i]++;i++}}END{for(num in word){print num,word[num]}}‘ /etc/fstab

(4)、计算男生女生的总成绩,平均成绩

#cat 1.txt
mage    100    male
wang    80     male
zhang   70     female
li      100    female
#awk ‘{if($3=="male"){msum+=$2;mnum++}else{fesum+=$2;fenum++}}END{printf "%-5d %-.2f\n%-5d %-.2f\n",msum,msum/mnum,fesum,fesum/fenum}‘ 1
时间: 2024-08-07 08:34:11

linux 文本三剑客之awk的相关文章

Linux 文本三剑客之awk 木石前盟

前言 一.木石前盟 众所周知,我们大中华上下5千年历史,其中当属"四大名著"最让人津津乐道.<红楼梦>一书更为四大名著之首,被评为中国古典章回小说的巅峰之作,是中国最受重视的一部文学作品.此书由清代作家曹雪芹所作,故事主线为贾宝玉.林黛玉及薛宝钗三人的爱情与婚姻悲剧,以及贾府等四大家族的没落. 故事开头即提到木石前盟一事.说到林黛玉的前身是绛珠仙草,贾宝玉的前身是神瑛侍者.<红楼梦>第一回"甄士隐梦幻识通灵 贾雨村风尘怀闺秀 "中有这样一段描

Linux文本三剑客之awk的使用

文本处理三剑客: grep.egrep.fgrep:称为文本过滤工具 sed:称为流编辑器,行编辑器 awk:称为报告生成器,主要用于格式化文本输出 awk:Aho,Weinberher,Kernighan 由这个三个作者创建而成,最初是用在UXIN系统上面,后来被GNU组织不断对其进行更新,就形成了gawk,现在linux上用的都是gawk. [[email protected] tmp]# which awk /bin/awk [[email protected] tmp]# ll -d /

Linux文本三剑客之awk

awk:报告生成器,格式化文本输出 AWK: Aho, Weinberger, Kernighan --> New AWK, NAWK GNU awk, gawk gawk - pattern scanning and processing language 基本用法:gawk [options] 'program' FILE ... program: PATTERN{ACTION STATEMENTS} 语句之间用分号分隔 print, printf 选项: -F:指明输入时用到的字段分隔符

linux文本三剑客匹配网卡IP地址大PK(CentOS 7系统)

    运维工程师在做配置的过程中很多时候都需要去获取目标服务器网卡上的IP地址,那究竟用什么方式获取更便捷了,博主今天就带大家使用linux文本三剑客分别获取一下网卡的IP地址,最后我们再来对比一下. 实验环境: 系统:CentOS 7.2 网卡张数:双网卡 linux文本三剑客之grep 获取ifconfig输出中的IP地址 ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>.(\

Linux文本处理工具AWK使用解析

在linux系统上有三大文本处理工具分别是:grep,sed,awk,这次主要来看看awk. awk  option  'pattern'  file -F    指定分隔符: -v     申明自定义变量: 查看当前系统上,用户名和用户shell,输出分隔符为~. # awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}{print $1,$7}END{print "================end===

文本三剑客之awk进阶篇

此篇主要讲解awk控制语句,捎带说明getline和NR_FNR命令的使用.其中会用到awk基础知识,若有疑惑,可点击文本三剑客之awk基础篇进行翻阅. 示例文件 以下为通篇会用到的几个示例文件: [[email protected] awk_file]# cat file.txt name yu shu wai rick 80 86 90 long 68 89 78 jack 66 60 82 [[email protected] awk_file]# cat file.txt1 name y

Linux上文本三剑客之awk详解

AWK介绍 Linux 文本处理工具三剑客:grep.sed.awk.其中grep是一种文本过滤工具:sed是文本行编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,但这里的格式化不是文件系统的格式化,而是对文件内容进行各种"排版",进而格式化显示:在Linux之上我们使用的是GNU awk 简称gawk,并且gawk就是awk的链接文件,因此系统上使用的awk和gawk是一样的.gawk是一种过程式编程语言.gawk还支持条件判断.数组.循环等编程语言中所有可以使用的功能

Linux文本三剑客超详细教程---grep、sed、awk

awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理. 1.grep 1.1 什么是grep和egrep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红).grep全称是Global

linux基础篇-文本三剑客之AWK

awk介绍 ? awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 ? 有多种版本:New awk(nawk),GNU awk( gawk) ? gawk:模式扫描和处理语言? 基本用法:awk [options] 'program' var=value file-awk [options] -f programfile var=value file-awk [options] 'BEGIN{ action;- } pattern{ action;- } E