shell编程----shell对输出流的输出,awk命令

本文详细介绍了awk编程语言,包括其对输出流的处理,awk的基本和高级用法,如字段和记录提取、数组定义、运算、环境变量以及流程控制。通过实例演示了awk如何用于数据提取,如打印特定字段、行号匹配和正则表达式匹配等。同时,文章还分享了一些awk的小技巧,如计算行数、列数和打印最后一行内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk介绍

awk是一种可以处理数据、产生格式化报表的语言,功能十分强大,awk认为文件中每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符。

awk的工作方式是读取数据,将每一行视为一条记录,每条记录以字段分隔符分成若干字段,然后输出各个字段的值

awk语法:awk [options][BEGIN]{program}[END][file]

常用命令选项:

-F fs 指定描绘一行中数据字段的文件分隔符,默认为空格

-f file  指定书读程序的文件名

-v var=value  定义awk程序中使用的变量和默认值

注意:awk程序脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间。

awk程序运行优先级是:

1) BEGIN:在开始处理数据流之前执行,可选项

2) program:如何处理数据,必选项

3) END:处理完数据流后执行,可选项

awk基本用法-awk数据提取功能

学习用例,数据源test.txt

1> awk对字段(列)的提取

字段提取:提取一个文本中的一列数据并打印输出

字段相关内置变量

$0  表示整行文本

$1  表示文本中的第一个数据字段

$2  表示文本中的第二个数据字段

$N  表示文本中的第N个数据字段

$NF  表示文本中的最后一个数据字段

1) awk '{print $0}' test.txt  读入text.txt每行数据并把每行数据打印出来

2) awk '{print $NF}' test.txt  读入text.txt每行数据并打印最后一列

3) awk '{print $3}' test.txt  读入text.txt每行数据并打印第三列

2> awk对记录(行)的提取

记录提取:提取一个文本中的一行并且打印输出

记录的提取方式有两种:a、通过行号b、通过正则匹配

记录相关内置变量

NR:指定行号

1) awk 'NR==3{print $0}' test.txt    获取test.txt第三行数据

 2) awk -F ":" 'NR==1{print $1,$3,$5}'  /etc/passwd 获取/etc/passwd第一行中第1、3、5列的数据,/etc/passwd中的字段以:作为分隔符,所以需要指定分隔符:

3> awk程序的优先级

关于awk程序的执行优先级,BEGIN是优先级最高的代码块,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及到任何数据的处理,也不依赖与PROGRAM代码块;OROGRAM是对数据流做操作,是必选的代码块,也是默认的代码块,所以在执行的时候必须提供数据源;END是处理完数据流之后的操作,如果需要执行END代码块,就必须需要PROGRAM的支持,单个无法执行

1) awk 'BEGIN{print "hello lavender"}{print $0}END{print "bye lavender"}' test.txt

2) awk 'BEGIN{print "hello lavender"}'     不需要数据源  可以直接执行

3) awk '{print "hello lavender"}'      awk 'END{print "hello lavender"}'  没有提供数据流,所以无法执行

4) awk '{print "hello lavender"}'  test.txt

awk高级用法

1> awk定义数组

数组定义方式:数组名[索引]=值

awk 'BEGIN{array[0]=100;array[1]=200;print array[0],array[1]}'

awk中可以定义变量   head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}'  计算内存使用率

2> awk运算 

1. 赋值运算  =

2. 比较运算 > >= == < <= !=

3. 数学运算 + - * / % ** ++ --

4. 逻辑运算 && ||

5. 匹配运算 ~ !~

1) 赋值运算,见上面的变量和数组定义

2) 比较运算 如果比较的字符串则按ascii编码顺序比较,如果结果返回为真则用1表示,如果返回为假则用0表示

3) 数学运算

4) 逻辑运算

5) 匹配运算

 

3> awk环境变量

FIELDWIDTHS   以空格分隔的数字列表,用空格定义每个数据字段的精确宽度

FS                       输入字段分隔符号

OFS                    输出字段分隔符号

RS                      输入记录分隔符

ORS                   输出记录分隔符号

awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $1,$3,$5}' /etc/passwd

4> 流程控制

1. if判断语句

2. for循环语句

3. while循环语句

4. do...while语句

5. 循环控制

学习用例;num.txt

1) 打印$1大于5的行

2) 累加

awk小技巧

1> 打印test.txt文本中的行数 awk 'END{print NR}' test.txt

 2> 打印test.txt文本最后一行的内容 awk 'END{print $0}' test.txt

3> 打印test.txt文本中的总列数 awk 'END{print NF}' test.txt

学习视频:https://www.bilibili.com/video/BV1vE41127wm?p=28

https://www.bilibili.com/video/BV1vE41127wm?p=29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值