shell学习笔记——shell对输出流的处理awk

一、awk介绍

内存使用率

[root@localhost ~]# free
s              total        used        free      shared  buff/cache   available
Mem:        1743568      338732      981252        9476      423584     1366680
Swap:      12451824           0    12451824
[root@localhost ~]# head -3 /proc/meminfo
MemTotal:        1743568 kB
MemFree:          981528 kB
MemAvailable:    1366972 kB
[root@localhost ~]#

awk是一个行编辑器,它可以把每一行每一列进行截取,可以实现数据的处理和计算。awk认为文件中的每一行时一条记录,记录于记录的分隔符为换行符,每一列是一个字段 字段与字段的分隔符默认是一个或多个空格或者tab制表符。

二、awk的基本用法—awk数据提取功能

测试内容:
[root@localhost awk]# cat test.sh
1 the quick beown fox junps over the lazy cat . dog
2 the quick beown fox junps over the lazy cat . dog
3 the quick beown fox junps over the lazy cat . dog
4 the quick beown fox junps over the lazy cat . dog
5 the quick beown fox junps over the lazy cat . dog

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

字段提取:提取一个文本中的一列数据并打印输出
字段相关内置变量
$0 表示整行文本
$1 表示文本行中的第一个数据字段
$2 表示文本行中的第二个数据字段
$N 表示文本行中的第N个数据字段
$NF 表示文本行中的最后一个数据字段

#打印全部
[root@localhost awk]# awk '{print $0}' test.sh
1 the quick beown fox junps over the lazy cat . dog
2 the quick beown fox junps over the lazy cat . dog
3 the quick beown fox          junps over the lazy cat . dog
4 the quick beown fox junps over the lazy cat . dog
5 the quick beown fox junps over the lazy cat . dog

#打印最后一列
[root@localhost awk]# awk '{print $NF}' test.sh
dog
dog
dog
dog
dog

#打印第三列
[root@localhost awk]# awk '{print $3}' test.sh
quick
quick
quick
quick
quick

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

记录提取:提取一个文本中的一行并打印输出
记录的提取方法有两种:a、通过行号 b、通过正则匹配
记录相关内置变量
NR:指定行号

#提取第三行的所有内容
[root@localhost awk]# awk 'NR==3{print $0}' test.sh
3 the quick beown fox          junps over the lazy cat . dog

2.1指定分隔符

“-F”

#如下:打印第一行的第一列的字符,以“:”冒号作为分隔符
[root@localhost awk]# awk -F ":" 'NR==1{print $1}' passwd
root
[root@localhost awk]# awk -F: 'NR==1{print $1}' passwd
root

#如下:打印第一行的第一、三、五列的字符,以“:”冒号作为分隔符
[root@localhost awk]# awk -F ":" 'NR==1{print $1,$3,$5}' passwd
root 0 root

#自定义输出格式
[root@localhost awk]# awk -F ":" 'NR==1{print $1 "-" $3 "-" $5}' passwd
root-0-root

#输出成:“account:root UID:0 DESC:root”
[root@localhost awk]# awk -F ":" 'NR==1{print "account:"$1, "UID:"$3, "DESC:" $5}' passwd
account:root UID:0 DESC:root

3、awk程序的优先级

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

#优先级展示
[root@localhost awk]# awk 'BEGIN{print "hello ayitual"}{print $0}END{print "bye ayitula"}' test.sh
hello ayitual
1 the quick beown fox junps over the lazy cat . dog
2 the quick beown fox junps over the lazy cat . dog
3 the quick beown fox          junps over the lazy cat . dog
4 the quick beown fox junps over the lazy cat . dog
5 the quick beown fox junps over the lazy cat . dog

bye ayitula

#begin不需要数据源也能执行
[root@localhost awk]# awk 'BEGIN{print "hello ayitual"}'
hello ayitual

#没有提供数据源,无法执行成功
[root@localhost awk]# awk '{print "hello ayitual"}'
^C
[root@localhost awk]# awk 'END{print "hello ayitual"}'
^C

三、awk的高级用法

awk是一门语言,那么就会符合语言的特性,除了可以定义变量外,还可以进行运输,流程控制。

1、awk定义数组

数组定义方式:数组名【索引】=值
定义数组array,有两个元素,分别是100,200,打印数组元素。

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

2、awk运算

1.赋值运算 =
2.比较运算 > >= == < <= !=
3.数学运算 + - * / % ** ++ –
4.逻辑运算 && ||
5.匹配运算 ~ !~

例:计算内存使用率

#计算内存使用率
[root@localhost awk]# head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print(t-f)*100/t "%"}'
30.3599%
[root@localhost awk]# seq 1 10 > mun
[root@localhost awk]# awk '$1>5{print $0}' mun
6
7
8
9
10
[root@localhost awk]# awk '$1>=5{print $0}' mun
5
6
7
8
9
10
[root@localhost awk]# awk '$1 !=5{print $0}' mun
1
2
3
4
6
7
8
9
10
#模糊匹配
[root@localhost awk]# awk -F: '$1 ~ "ro"{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F: '$1 !~ "ro"{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mqm:x:998:1000::/var/mqm:/bin/bash
[root@localhost awk]#

3、awk环境变量

变量描述
FIELDWIDTHS以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS输入列分隔符号
OFS输出列分隔符号
RS输入行分隔符
ORS输出行分隔符号
# FIELSWISTHS:重定义列宽并打印,注意不可以使用$0答应所有,因为$0是打印本行全部内容,不会打印你定义的字段
[root@localhost awk]# awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' passwd
root: x: 0:0:root
[root@localhost awk]# awk -F: 'NEGIN{FS=":"}$1 !~ "ro"{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mqm:x:998:1000::/var/mqm:/bin/bash

[root@localhost awk]# awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$3,$5}' passwd
root-0-root

[root@localhost awk]# awk 'BEGIN{RS=""}{print $1,$2,$3,$4,$5}' mun
1 2 3 4 5

4、流程控制

1、if判断语句
2、for循环语句
3、while循环语句
4、do…while语句
5、循环控制

if判断语句

[root@localhost awk]# awk '{if($1>5)print $0}' mun
6
7
8
9
10
[root@localhost awk]# awk '{
> if ($1<5)
>   print $1*2
> else
>   print $1/2
> }' mun
2
4
6
8
2.5
3
3.5
4
4.5
5
[root@localhost awk]# awk '{if ($1<5) print $1*2;else print $1/2}' mun
2
4
6
8
2.5
3
3.5
4
4.5
5
#每行每列累加
[root@localhost awk]# awk -v 'sum=0' '{sum+=$1} END{print sum}' mun
55
[root@localhost awk]# echo 60 50 100 > num2
[root@localhost awk]# echo 150 30 10 >> num2
[root@localhost awk]# echo 70 100 40 >> num2
[root@localhost awk]# cat num2
60 50 100
150 30 10
70 100 40

for循环语句

#每列相加
[root@localhost awk]# awk '{
> for (i=1;i<4;i++)
>   sum+=$i
> print sum}' num2
210
400
610
[root@localhost awk]# awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2
210
190
210

while 循环语句

[root@localhost awk]# awk '{
> sum=0
> i=1
> while (i<4) {
> sum+=$i
> i++
> }
> print sum}' num2
210
190
210
[root@localhost awk]# awk '{sum=0;i=1;while (i<4) {sum+=$i;i++}print sum}' num2
210
190
210

do…while循环语句

#当每行第一个值小于150时就相加第二个值
[root@localhost awk]# awk '{
> sum=0
> i=1
> do{
> sum+=$i
> i++
> }while (sum<150)
> print sum
> }' num2
210
150
170
[root@localhost awk]# awk '{sum=0;i=1;do{sum+=$i;i++}while (sum<150)print sum}' num2
210
150
170

循环控制语句

break跳出循环,继续执行后续循环语句

#累加每行数值和大于150时停止累加
[root@localhost awk]# awk '{sum=0;i=1;while (i<4) {sum+=$i;if (sum>150){break}i++}print sum}' num2
210
180
170

5、小技巧

打印行数
[root@localhost awk]# awk ‘END{print NR}’ test.sh
6
打印最后一列内容
[root@localhost awk]# awk ‘END{print $0}’ test.sh

打印列数
[root@localhost awk]# awk ‘END{print NF}’ test.sh
0

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XL's妃妃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值