文本三剑客之awk

awk

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

awk处理过程: 依次对每一行进行处理,然后输出

awk命令形式:

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file

[-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value

'  '          引用代码块

BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

//           匹配代码块,可以是字符串或正则表达式

{}           命令代码块,包含一条或多条命令

;          多条命令使用分号分隔

END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

一、awk工作原理:

1.首先,执行BEGIN{action statements}语句块中的语句;

2.其次,从文件中或者从标准输入读取一行,然后执行pattern{action statements}语句块;逐行重复处理该过程,直到数据全部被读取完毕;

3.在其他语句执行完成后,在退出awk程序之前,执行END{action statements}语句块;

注意:

1).BEGIN语句块在awk开始处理数据之前就需要执行;此语句块是可选语句块;

2).END语句块在awk处理完所有的数据之后,才会被执行;此语句块是可选语句块;

3).pattern语句块中的通用命令是最重要的部分,也是可选的;如果没有提供pattern语句块,则默认执行{ print }语句,显示数据的每一行;awk读取到的每一行都会执行一次pattern语句块的内容;

二、特殊要点:

$0           表示整个当前行

$1           每行第一个字段

NF          字段数量变量

NR          每行的记录号,多文件记录递增

FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

\t            制表符

\n           换行符

FS          BEGIN时定义分隔符

RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~            匹配,与==相比不是精确比较

!~           不匹配,不精确比较

==         等于,必须全部相等,精确比较

!=           不等于,精确比较

&&      逻辑与

||             逻辑或

+            匹配时表示1个或1个以上

/[0-9][0-9]+/   两个或两个以上数字

/[0-9][0-9]*/    一个或一个以上数字

FILENAME 文件名

OFS       输出字段分隔符, 默认也是空格,可以改为制表符等

ORS         输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]'   定义三个分隔符

三、常用的ACTION:

1.print:标准格式显示;

print item1,item2,...

print命令的要点:

a.逗号分隔;

b.输出的各item可以是字符串,可以是数字,可以是当前记录中的字段,可以是变量,可以是awk表达式;

c.如果省略了item,就输出整行,相当于{print $0};

示例:

~]# awk -F: '{print $1,$3,$7}' /etc/passwd

~]# echo -e "1 2 3\n4 5 6\n7 8 9" | awk '{print $2}'

2.变量:

内建变量:

FS:input field seperator,输入字段分隔符,默认空白字符;

示例:

~]# awk -v FS=':' '{print $1}' /etc/passwd

OFS:outpit field seperator,输出字段分隔符,默认空白字符;

示例:

~]# awk -v FS=':' -v OFS=':' '{print $1,$3}' /etc/passwd

RS:input record seperator,输入记录分隔符,默认换行符;

注意:即使指定了新的输入记录分隔符,原换行符仍然有效;

示例:

~]# awk -v RS='/' '{print $0}' /etc/passwd

ORS:output record seperator,输出记录分隔符;

NF:number of field,字段数量;

示例:

~]# awk -v FS=':' '{print NF}' /etc/passwd

~]# awk -v FS=':' '{print $NF}' /etc/passwd

~]# awk -v FS=':' '{print $(NF-1)}' /etc/passwd

NR:number of record,行数;鉴于awk遍历文件每行的特性,可以将该变量理解为行号;

示例:

~]# awk  '{print NR}' /etc/passwd

FNR:file number of record,分别统计各个文件的行数,行号;

示例:

~]# awk  '{print FNR}' /etc/passwd /etc/fstab

FILENAME:输出当前正在处理的文件的文件名;

示例:

~]# awk  '{print FILENAME}' /etc/passwd /etc/fstab

ARGC:argument count,整个命令行中的参数的数量;包括命令本身;

示例:

~]# awk  '{print ARGC}' /etc/passwd /etc/fstab /etc/issue

ARGV:数组,argument value,保存了命令行中各个参数的具体内容;

示例:

~]# awk  '{print ARGV[1]}' /etc/passwd /etc/fstab /etc/issue

自定义变量:

定义方式:

-v var=value

注意:变量名区分字符大小写;

示例:

~]# awk -v var1='hello' -F: '{print var1 ,$1}' /etc/passwd

3.printf命令:

格式化输出命令:printf "FORMAT" item1,item2,...

要点:

1) 必须给出合适的FORMAT;

2) 默认不自动换行,需要显式给出换行控制符(\n);

3) FORMAT中需要为后面的每一个item指定一个格式化符号;

格式符:

%c:显示字符的ASCII码;

%d,%i:显示十进制整数;

%f:显示浮点数字;

%e,%E:使用科学计数法显示数字;

%g,%G:使用科学计数法显示浮点数字;

%s:显示字符串;

%u:显示无符号整数;

%%:显示%自身;

修饰符:

#[.#]:第一个数字用来控制显示宽度;第二个数字表示小数点的精度;

如:%3.1f  %5s

-:表示采用左对齐机制;默认是右对齐; %-15s

+:显示数字的正负符号;%+d

示例:

~]# awk -F: '{printf "%-20s: %-5s\n",$1,$3}' /etc/passwd

4.操作符:

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y

-x:将正数转换为负数;

+x:将字符串转换为数值;

字符串操作符:

没有符号的操作符,表示字符串连接之意;

赋值操作符:

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

++, --

比较操作符:

>, >=, <, <=, ==, !=

模式匹配操作符:

~:左侧的字符串是否能够被右侧的模式所匹配;

!~:左侧的字符串是否不能够被右侧的模式所匹配;

示例:

~]# awk -F: '$3==1000{print $0}' /etc/passwd

~]# awk -F: '$NF~/bash/{print $0}' /etc/passwd

逻辑操作符:

&&

||

!

示例:

~]# awk -F: '$3>=500&&$3<=1000{print}' /etc/passwd

条件表达式:

condition(selector)?if-true-expression:if-false-expression

示例:

~]# awk -F: '{$3>=1000?usertype="Common User":usertype="Super or System User";printf "%-20s: %-20s\n",usertype,$1}' /etc/passwd

5.PATTERN:

1) empty:空模式,处理文件中的每一行;

2) [!]/REGEXP/:仅处理[不]能被PATTERN匹配到的行;

示例:~]# awk '[!]/^r/{print}' /etc/passwd

3) 关系表达式:$3>=1000, $NF~/bash/

4) 行的范围:

关系表达式:($3>=500&&$3<=1000)

/regexp1/,/regexp2/:从被regexp1匹配的行开始到被regexp2匹配的行结束,有多少这一类匹配结果,就显示多少次;

示例:~]# awk '/^r/,/^a/{print}' /etc/passwd

5) BEGIN/END模式:

BEGIN{}:仅在开始处理文件中的第一行文本之前执行一次的语句块;

示例:

~]# awk -F: 'BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}' /etc/passwd

注意:在输出特定格式的表头时,常用此语句块;

END{}:仅在文本处理完成但命令尚未退出时执行一次的语句块;

示例:

~]# awk -F: 'BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}END{print "========================\n",NR " users"}' /etc/passwd

6.常用的ACTION:

1.表达式(Expression)

2.组合语句(Cpmpound Statement)

3.输入语句(Input Statement)

4.输出语句(Output Statement)

5.控制语句(Control Statement)

7.控制语句:

if (condition) statement [ else statement ]

while (condition) statement

do statement while (condition)

for (expr1; expr2; expr3) statement

for (var in array) statement

break

continue

delete array[index]

delete array

exit [ expression ]

{ statements }

switch (expression) {case value|regex : statement...[ default: statement ]}

1) if-else:

语法:if (condition) {statement} [ else {statement} ]

使用场景:对awk取得的整行或某个字段做条件判断;

示例:

~]# awk -F: '{if($3>=1000) {print $1} else {print $1,$3}}' /etc/passwd

2) while循环:条件为真,进入循环;条件为假,退出循环;

语法:while (condition) statement

使用场景:对一行内的多个字段逐一做类似的处理时;对数组中的各个元素遍历及处理时;

示例:

~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%s: %d\n",$i,length($i);i++}}' /etc/grub2.cfg

3) do...while循环:

语法:do statement while (condition)

意义:同while循环,但至少执行一次循环体中的语句;

4) for循环:

语法:for (expr1; expr2; expr3) statement

expr1:变量赋初值;

expr2:条件判断;

expr3:变量值的递增或递减调整;

示例:

~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {printf "%s: %d\n",$i,length($i)}}' /etc/grub2.cfg

5) break 和 continue

break [n]

continue:跳过本次循环,直接进入下次循环;

6) next语句:

提前结束对本行的处理,而直接进入下一行;

示例:

~]# awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd

8.数组(Array)

关联数组:array[index_expression]

index_expression:

1) 可以使用任意的字符串,字符串必须使用双引号;

2) 如果某数组元素事先不存在,当引用该元素时,awk会自动创建此元素,并且为该元素赋"空字符串"作为其初始值;

注意:如果想要判断数组中某个元素是否存在,一般会使用"index in array"格式进行;

示例:

~]# awk 'BEGIN{name["leader"]="zhang";name["mem1"]="li";name["mem2"]="wang";print name["leader"]}'

查看已连接状态下,同一客户端的连接数量:

~]# ss -tn | awk '/^ESTAB\>/{print $NF}' | awk -F: '{state[$1]++}END{for(s in state){print state[s],s}}'

9.函数:

内建函数:

length():计算字符串长度

split(string,array[,fieldsep])

原文地址:http://blog.51cto.com/shenmengdong/2090679

时间: 2024-10-16 05:01:18

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

文本三剑客之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 木石前盟

前言 一.木石前盟 众所周知,我们大中华上下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同sed.grep被称为linux文本处理三剑客,都起源于行编辑器ed.awk继承了行编辑器的特点,循环的读取文本的每一行(或者是分隔符分割的每一段文本)直至文本结束,但是awk加入了段分割符的概念.将每次读入的行进行再次分割.awk每次读取的行都只是未经过awk语句处理的对象.或读取行后会根据段分割符在将行分成多个对象.结构近似数组,然后进行指定语句的操作.作为一款报表生成器,作用是对对文本内容进行各种排版,进而格式化显示. awk有自己的语法,可以说是一款独立的编程语言.

Linux上文本三剑客之awk详解

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

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基础篇-文本三剑客之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

文本三剑客之awk基础操作

1. awk基本介绍 功能说明:gawk - pattern scanning and processing languageawk是GNU项目,所以其实际的命令为gawk,因awk命令的二进制文件链接到gawk,所以awk命令亦是gawk命令. 1.1 描述 Gawk is the GNU Project's implementation of the AWK programming language. It conforms to the definition of the language

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])\>.(\