Shell学习总结-awk实用程序

本文详细介绍了awk编程语言,包括其不同版本awk、nawk和gawk的基础知识,以及从文件和命令输入、BEGIN和END模式、printf函数、条件语句、循环控制、数组操作和内置函数等核心概念。awk的强大之处在于处理和分析数据,例如通过模式匹配和自定义函数处理文本文件、管道输入和命令行参数。通过示例,展示了awk如何在shell脚本中用于数据处理和报告生成。
摘要由CSDN通过智能技术生成

FS---分隔符

OFS---(输出字段分隔符)

NF---总的行数

NR---当前的行数

目录

什么是awk、nawk、gawk

从文件输入

从命令输入

BEGIN模式

END模式

包含BEGIN和END模式的awk脚本

printf函数

打开和关闭管道

条件语句

if语句

if/else语句

循环

while循环

for循环

循环控制 

程序控制语句

next语句

exit语句

数组

关联数组的下标

特殊for循环

用字符串作为数组下标

使用字段的值作为数组下标

数组与split函数

多维数组(nawk) 

处理命令行参数(nawk) -----传参

awk的内置函数

字符串函数

index函数

length函数

substr函数 

match函数

split函数

sprintf函数

内置算术函数

整数函数

随机数生成器

rand函数 

srand函数

用户自定义函数(nawk)

复习

杂项

固定字段

空字段

带$、逗号或其它字符的数字

 多行记录

生成格式信函

与shell交互 


 

131-

什么是awk、nawk、gawk

awk是一种用于处理数据和生成报告的UNIX编程语言。nawk是awk的新版本,gawk是基于Linux的GNU版本。

处理的数据可以来自标准输入、一个或多个文件,也可以来自某个进程的输出。awk可以在命令行进行一些简单的操作,也可以编写成程序来处理较大的应用。因为awk可以处理数据,所以它是执行shell脚本和管理小型数据库不可或缺的工具。

awk以逐行方式扫描文件(或输入),从第一行到最后一行,以查找匹配某个特定模式的文本行,并对这些文本行执行(括在花括号中的)指定动作。如果只给出模式而未指定动作,则所有匹配该模式的行都显示在屏幕上;如果只指定动作而未指定模式,会对所有输入行执行指定动作。

132-

从文件输入

格式

nawk 'pattern' filename
nawk '{action}' filename
nawk 'pattern {action}' filename
nawk '/Mary/' employees

nawk打印出所有包含模式Mary的行。

nawk '{print $1}' employees

nawk打印出文件emplyees的第一个字段,字段从行的左端开始,以空白符分隔

nawk '/Sally/{print $1,$2}' employees

当文件employees中的某一行含有模式Sally时,nawk打印该行的头两个字段。记住,字段的分隔符是空白符。

133-

从命令输入

可以将一条或多条UNIX或者Linux命令的输出通过管道发送给awk处理。shell程序通常使用awk来处理命令。

格式

command | nawk 'pattern'
command | nawk '{action}'
command | nawk 'pattern {action}'

范例

df | nawk '$4 > 75000'
rusers |nawk '/root$/{print $1}'

1,df命令报告文件系统的磁盘空间剩余情况,df命令的输出通过管道发给nawk(新nawk)。如果其中某行的第四个字段大于75000块,则该行被打印。

2,rusers命令打印出有哪些用户登录在局域网的其他机器上。rusers的输出通过管道发送给awk,作为它的输入。如果输出中有某行正以正则式root结尾($),就打印该行的第一个字段,即root登录的所有机器名

BEGIN模式

nawk 'BEGIN{print "------EMPLOYEES-------------"}'

BEGIN模式带有一个操作块,其操作是在打开输入文件之前打印字符串"------EMPLOYEES-------------"。注意,本例的命令行并未提供输入文件,但awk并不受影响,因为awk首先执行的是BEGIN中的命令,而不是查找输入文件。

nawk 'BEGIN{print "\t\t--------------EMPLOYEES------------\n"}\
{print $0}' datafile

BEGIN操作块最先被执行,于是打印出标题“---------EMPLOYEES--------------”。第二个操作块打印 输入文件中的每一条记录。当命令需换行时,可以用反斜杠来取消回车,且在分号或花括号处进行

$0是全部的数据

nawk 'BEGIN{FS=":";OFS="\t"};/^Sharon/{print $1,$2,$8}' datafile

BEGIN操作块被用来初始化变量。变量FS(字段分隔符)被设为冒号,变量OFS(输出字段分隔符)则被设为制表符(\t)。处理完BEGIN操作块中的内容后,awk就打开datafile2文件并从中读取记录。如果某条记录以正则表达式Sharon开头,则打印它的1、2、8字段($1,$2,$8)。输出结果的字段以制表符分隔

184-

END模式

nawk 'END{print "The total number of records is "NR}' datafile

awk 处理完输入文件后,就开始执行END块中的语句:打印字符串“The total number of record is”,后面跟上NR的值,即最后一条记录的记录号。

nawk '/^north/{count++}END{print count}' datafile

如果记录以正则表达式north开头,用户自定义变量count就加1。awk处理完输入文件后,打印变量count的值。

185-

包含BEGIN和END模式的awk脚本

BEGIN{FS=":"
print "NAME\t\tDISTRICT\tQUANTITY"
print "------------------------\n"
}

{print $1"\t   "$3"\t\t" $7}
{total+=$7}
/north/{count++}

END{
print "-------------------------"
print "The total quantity is" total}
print "The number of northern salesperson is" count "."
}
nawk -f awk.sc1 datafile2

1,BEGIN块最先执行:设置字段分隔符(FS),并打印输出的表头

2,awk脚本的正文部分包含的语句对来自输入文件datafile2的每一行都要执行一遍操作。

3,END块中的语句是在输入文件关闭之后,即awk退出之前执行。

4,nawk程序是在命令行上执行的。-f选项后面跟着脚本的名字awk.sc2,再往后则是输入文件的名字datafile2

186-

printf函数

nawk '{printf "$%6.2f\n",$6*100}' datafile

printf函数将浮点数的格式设置为右对齐(默认格式),总长度为6为,,其中小数点占一位,小数点右边占两位。第6个字段的值将在四舍五入后被打印。

nawk 'printf "|%-15s|\n",$4' datafile

打印一个左对齐(-) 、长度为15的字符串。第4个字段被打印在两个竖杠之间。竖杠用来标明打印的宽度。

187-

重定向与管道

nawk '/north/{print $1,$3,$4 > "districts"}' datafile
cat districts

如果记录中包含正则表达式north,则将其第1、3、4字段($1,$3,$4)打印到输出文件districts中,文件被打开后就保持打开状态直至被关闭或程序终止。文件名"districts"必须加双引号。

nawk '/south/{print $1,$2,$3 >> "districts"}' datafile
cat districts

如果记录中包含正则表达式north,则将其第1、2、3字段($1,$2,$3)追加到输出文件districts的尾部。

188-

打开和关闭管道

BEGIN{
printf "%-22s%s\n","NAME","DISTRICT"
print "---------------------------"
}
/west/{count++}
{printf "%s %s\t\t%-15s\n",$3,$4,$1|"sort +1"}
END{
close "sort +1"
printf "The number of sales persons in the western"
printf "region is" count "." }
n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值