文档目录

一、awk介绍

二、awk基本用法

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

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

3、awk对字符串提取:

4、awk程序的优先级:

三、awk高级用法

1、awk定义数组

2、awk运算

3、awk环境变量:

4、流程控制

四、awk小技巧

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 分隔符- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

一、awk介绍

 1、shell对输出流的处理:

日常计算机管理中,总会有很多数据输出到屏幕或者文件,这些输出包含了标准输出、标准错误输出,默认情况下,这些信息全部输出到屏幕,而其中只有一小部分是我们关注的内容,需要我们把关注的重点内容过滤或提取出来以备后续的使用。可以使用grep、cut、tr等命令过滤或提取数据,但是他们都不具备同时提取并处理数据的能力,而awk命令集过滤、提取、运算为一体,平行命令还有gawk、pgawk、dgawk。

2、awk简介:

awk是一种可以处理数据、产生格式化报表的语言,功能十分强大。

awk认为文件中每一行是一条记录,记录之间分隔符为换行符,每一列是一个字段,字段之间的分隔符默认是一个或多个空格或tab制表符。

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

3、awk语法:awk [options] [BNGIN] {program} [END][file]

4、常用命令选项:

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

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

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

注意:awk程序脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间,由于awk假定程序脚本是单个文本字符串,因此必须还要将脚本放到单引号中。

5、awk程序运行优先级是:

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

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

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

二、awk基本用法

[root@localhost test20210811]# cat test  #测试数据
1 the quick brown fox jumps over the lazy cat . dog
2 the quick brown fox jumps over the lazy cat . dog
3 the quick brown fox jumps over the lazy cat . dog
4 the quick brown fox jumps over the lazy cat . dog
5 the quick brown fox jumps over the lazy cat . dog

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

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

字段相关内置变量:

$0:表示整行文本

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

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

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

$NF:表示文本行中的最后一个字段

举例说明:

[root@localhost test20210811]# awk '{print $0}' test  #打印全文本
1 the quick brown fox jumps over the lazy cat . dog
2 the quick brown fox jumps over the lazy cat . dog
3 the quick brown fox jumps over the lazy cat . dog
4 the quick brown fox jumps over the lazy cat . dog
5 the quick brown fox jumps over the lazy cat . dog
[root@localhost test20210811]# awk '{print $NF}' test #打印最后一列
dog
dog
dog
dog
dog
[root@localhost test20210811]# awk '{print $3}' test #打印第3列
quick
quick
quick
quick
quick
[root@localhost test20210811]# awk -v name='mrwhite' 'BEGIN{print name}' #定义变量,调用变量打印
mrwhite

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

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

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

记录相关内置变量

NR:指定行号

举例说明:

[root@localhost test20210811]# awk 'NR==3{print $0}' test  #打印第3行
3 the quick brown fox jumps over the lazy cat . dog
[root@localhost test20210811]# awk 'END{print $0}' test #打印最后1行
5 the quick brown fox jumps over the lazy cat . dog

3、awk对字符串提取:

记录和字段的汇合点就是字符串

[root@localhost test20210811]# awk -F " " 'NR==3{print "第3行第2个单词:"$2,"第3行第5个单词"$5}' test   #提取用户文件第3行的第2,5个字段并拼接语句,空格分隔
第3行第2个单词:the 第3行第5个单词fox
[root@localhost test20210811]# head -2 /proc/meminfo #内存信息
MemTotal: 995672 kB
MemFree: 669620 kB
[root@localhost test20210811]# head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print(t-f)*100/t "%"}' #打印内存使用率
32.7751%

4、awk程序的优先级:

[BNGIN] -> {program}  -> [END] ,其中 {program}是必须包含的

[root@localhost test20210811]# awk  'BEGIN{print "hello,let us start!"}NR==1{print $0}END{print "Bye Bye!"}' test  #在执行命令前后增加BEGIN于END语句
hello,let us start!
1 the quick brown fox jumps over the lazy cat . dog
Bye Bye!
[root@localhost test20210811]# awk 'BEGIN{print "helloworld"}' #BEGIN可以单独执行,不需要数据流
helloworld
[root@localhost test20210811]# awk 'END{print "helloworld"}' #END无法执行,需要数据流
^C
[root@localhost test20210811]# awk '{print "helloworld"}' #无法单独执行,需要数据流
^C

三、awk高级用法

1、awk定义数组

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

[root@localhost test20210811]# awk 'BEGIN{array[1]="one";array[2]=500;print array[1],array[2]}'  #定义数组并打印
one 500

2、awk运算

1)赋值运算 =

[root@localhost test20210812]# awk 'BEGIN{name="bktest";print name}'  #BEGIN内赋值
bktest
[root@localhost test20210812]# awk -v name='bktest2' 'BEGIN{print name}' #-v定义变量
bktest2
[root@localhost test20210812]# awk 'BEGIN{array[0]=100;print array[0]}' #赋值数组
100
[root@localhost test20210812]#

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

如果是字符串比较则按照ascii编码顺序比较,如果结果返回true则用1表示,返回false用0表示

[root@localhost test20210812]# awk 'BEGIN{print "d">"b" }'  #字符串比较
[root@localhost test20210812]# awk 'BEGIN{print "a">="b" }' #字符串比较
0
[root@localhost test20210812]# awk 'BEGIN{print "a"<"b" }' #字符串比较
1
[root@localhost test20210812]# seq 1 10 > num #1到10输出到num文件
[root@localhost test20210812]# awk '$1>=8{print $0}' num #将大于等于8的数字打印
8
9
10
[root@localhost test20210812]# awk '$1==5{print $0}' num #将等于5的打印出
5

3)数据运算 +  -  *  /  %  **  ++  --

[root@localhost test20210812]# awk 'BEGIN{print 1+1}' #计算加法
2
[root@localhost test20210812]# awk 'BEGIN{print 100-50}' #计算加法
50
[root@localhost test20210812]# awk 'BEGIN{print 100/3}' #计算乘法
33.3333
[root@localhost test20210812]# awk 'BEGIN{print 1+1}' #计算加法
2
[root@localhost test20210812]# awk 'BEGIN{print 100-50}' #计算减法
50
[root@localhost test20210812]# awk 'BEGIN{print 100*3}' #计算乘法
300
[root@localhost test20210812]# awk 'BEGIN{print 5/3}' #计算除法
1.66667
[root@localhost test20210812]# awk 'BEGIN{print 2**3}' #计算2的三次方
8
[root@localhost test20210812]# awk 'BEGIN{print 100%3}' #计算取余数
1

4)逻辑运算 &&  ||

[root@localhost test20210812]# awk 'BEGIN{print 100>=2 && 100>=3}'  #且关系
1
[root@localhost test20210812]# awk 'BEGIN{print 100>=2 && 5<2}' #且关系
0
[root@localhost test20210812]# awk 'BEGIN{print 100>=2 || 5<2}' #或关系
1

5)匹配运算 == ~  ~!

[root@localhost test20210812]# awk -F: '$1=="root"{print $0}' /etc/passwd   #精确匹配
root:x:0:0:root:/root:/bin/bash
[root@localhost test20210812]# awk -F: '$1~"w"{print $0}' /etc/passwd #模糊匹配
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

3、awk环境变量:

变量 描述
FILEDWIDTH 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS 输入字段分隔符号(数据源-列)
OFS 输出字段分隔符号(打印屏幕-列)
RS 输入记录分隔符(数据源-行)
ORS 输出记录分隔符号(打印屏幕-行)

举例说明:

[root@localhost test20210812]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost test20210812]# awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd #指定打印3列,第1,2,3列分别打印5,2,8个字符
root: x: 0:0:root
[root@localhost test20210812]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd | head -3 #按照数据库:分隔打印第1列
root
bin
daemon
[root@localhost test20210812]# awk 'BEGIN{FS=":"}{print $1,$3,$5}' /etc/passwd | head -3 #按照数据库:分隔打印第1,3,5列,空格分隔
root 0 root
bin 1 bin
daemon 2 daemon
[root@localhost test20210812]# awk 'BEGIN{FS=":"}{print $1"-"$3"-"$5}' /etc/passwd | head -3 #按照数据库:分隔打印第1,3,5列,-分隔
root-0-root
bin-1-bin
daemon-2-daemon
[root@localhost test20210812]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$3,$5}' /etc/passwd | head -3 #按照数据库:分隔打印第1,3,5列,指定-分隔
root-0-root
bin-1-bin
daemon-2-daemon
[root@localhost test20210812]# seq 1 3 >num;cat num #构造数据
1
2
3
[root@localhost test20210812]# awk 'BEGIN{RS=""}{print $1,$2,$3}' num #指定数据源的数据分隔符为空格
1 2 3
[root@localhost test20210812]# awk 'BEGIN{RS="";ORS="####"}{print $1,$2,$3}' num #指定数据源的数据分隔符为空格,输出时行分隔为####
1 2 3####[root@localhost test20210812]#

4、流程控制

1)if判断语句

[root@localhost test20210813]# seq 0 3 >num  #构造数据0-3
[root@localhost test20210813]# awk '{if($1>2)print $0}' num #打印>2的行
3
[root@localhost test20210813]# awk '{if($1<1)print $0}' num #打印<1的行
0
[root@localhost test20210813]# awk '{if($1<2)print $1*10;else print $1/10}' num #前两行*10,其他/10
0
10
0.2
0.3

2)for循环语句

[root@localhost test20210813]# cat num2  #构造数据
60 50 100
150 30 10
70 100 40
[root@localhost test20210813]# awk '{for(i=1;i<4;i++){sum=$1+$2+$3}print sum}' num2 #每行累加
210
190
210
[root@localhost test20210813]# awk '{sum=0;for(i=1;i<4;i++){sum+=$i}print sum}' num2 #每行累加,第二种写法
210
190
210

3)while循环语句

[root@localhost test20210813]# cat num2  #构造数据
60 50 100
150 30 10
70 100 40
[root@localhost test20210813]# awk '{sum=0;i=1;while(i<4){sum+=$i;i++}print sum}' num2 #每行累加 210 190 210

4)do...while语句

[root@localhost test20210813]# cat num2  #构造数据
60 50 100
150 30 10
70 100 40
[root@localhost test20210813]# awk '{sum=0;i=1;do{sum+=$i;i++}while(i<4)print sum}' num2 #每行累加
210
190
210

5)循环控制(break跳出循环)

[root@localhost test20210813]# cat num2  #构造数据
60 50 100
150 30 10
70 100 40
[root@localhost test20210813]# awk '{sum=0;i=1;while(i<4){sum+=$i;if(sum>=180)break}i++;print sum}' num2 #每行累加,大于等于180停止
180
300
210
[root@localhost test20210813]# awk '{sum=0;i=1;while(i<4){sum+=$i;if(sum>=180)break;i++}print sum}' num2 #每行累加,大于等于180停止
210
180
210

四、awk小技巧

1、打印文本的行数

[root@localhost test20210813]# awk 'END{print NR}' /etc/passwd   #打印行数
21

2、打印文本最后一行的内容

[root@localhost test20210813]# awk 'END{print $0}' /etc/passwd   #打印文本最后一行内容
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

3、打印文本列数

[root@localhost test20210813]# cat num2  #构造数据
60 50 100
150 30 10
70 100 40
[root@localhost test20210813]# awk 'END{print NF}' num2 #打印文本列数
3

4、awk 中的大小写转化函数

[root@localhost test20210813]# echo | awk '{ print toupper("test"), tolower("TEST") }'
TEST test

5、去重并统计次数

[root@localhost test20210813]# cat num3  #测试数据
a 0
b 3
c 1
a 5
b 2
c 3
d 7
a 1
[root@localhost test20210813]# awk '{print $0}' num3 | awk '{h[$1]++}END{for(i in h)print i,h[i]}' #去重统计次数
a 3
b 2
c 2
d 1

6、去重并求和

[root@localhost test20210813]# cat num3  #测试数据
a 0
b 3
c 1
a 5
b 2
c 3
d 7
a 1
[root@localhost test20210813]# awk '{print $0}' num3 | awk '{h[$1]=h[$1]+$2}END{for(i in h)print i,h[i]}' #去重求和
a 6
b 5
c 4
d 7

7、截取字符串

[root@localhost test20210813]# echo '1234567890' > num4 #构造测试数据
[root@localhost test20210813]# awk '{print substr($0,1,6)}' num4 #截取字符串
123456

8、awk找出两个文件中相同的行

[root@localhost test20210813]# cat file1  #测试数据1
1111
2222
4444
5555
[root@localhost test20210813]# cat file2 #测试数据2
1111
3333
4444
5555
[root@localhost test20210813]# awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' file1 file2 > same.txt #记录文件相同的行
[root@localhost test20210813]# cat same.txt
1111
4444
5555

9、awk找出文件1在文件2没有的值

[root@localhost test20210813]# cat file1  #测试数据1
1111
2222
4444
5555
[root@localhost test20210813]# cat file2 #测试数据2
1111
3333
4444
5555
[root@localhost test20210813]# awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' file1 file2 > lack.txt #记录文件1在文件2没有的值
[root@localhost test20210813]# cat lack.txt
3333

shell脚本(16)-awk命令的更多相关文章

  1. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  2. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  3. shell脚本一条命令直接发送http请求(xjl456852原创)

    我们知道nc命令是一个网络工具.可以连接tcp/udp.也能模拟发送http请求. 现在介绍通过shell脚本,一条命令直接发送http请求. 命令如下,可以对下面的地址等信息自行修改: #!/bin ...

  4. shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出

    shell脚本中sqlite3命令查询数据库失败返回空,并将错误信息打印到标准错误输出 如: #/bin/sh local ret='sqlite3 test.db "select test ...

  5. (转)shell脚本之seq命令

    shell脚本之seq命令 原文:http://blog.csdn.net/paoxiaohui/article/details/52830595 seq 用于生成从一个数到另一个数之间的所有整数. ...

  6. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  7. SHELL 脚本----常用的命令

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂   建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行she ...

  8. shell脚本中常用命令

    1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值. 1.2    ...

  9. shell 脚本之获取命令输出字符串以及函数参数传递

    在ubuntu 14.04之后,所有的U盘挂载也分用户之分,最近很多操作也和U盘有关,所以就研究了一上午shell脚本函数以及字符串操作的方法. 字符串操作: 获取他的命令输出比较简单,打个简单的比方 ...

  10. Shell脚本中cd命令使用

    在写shell脚本的时候发现cd切换目录的时候无法切换,代码是下面的. #!/bin/bash #changedir.sh history cd /home/firefox sleep pwd 我仔细 ...

随机推荐

  1. [NOI online2022提高C] 如何正确地排序

    题目描述 有一个 \(m\times n\) 的数组 \(a_{i,j}\). 定义: \(f(i,j)=\min\limits_{k=1}^m(a_{k,i}+a_{k,j})+\max\limit ...

  2. Vue2路由嵌套是注意子路由path问题

    1.当子路由以/开始时,它会被视为根路由,并且会显示在URL的根路径中 2.当子路由不以/开始时,它将被视为相对路径,相对于父路由的路径

  3. 如何有效应对员工违规使用U盘的情况?

    在面对员工违规使用U盘的挑战时,华企盾DSC数据防泄密系统提供了一套综合而高效的解决方案. 通过系统的U盘加密功能,我们能够防止未经授权的U盘访问,确保敏感数据不会被非法传输.这一层保护不仅是基础性的 ...

  4. Java 面试题及答案整理(2021最新版)持续更新中~~~

    2021年java实习校招秋招春招 后端 知识点及面试题(持续更新) Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中 ...

  5. Python脚本猜解网站登录密码(带token验证)

    目录: 关键代码解释 设置请求头 get_token函数获取token值 完整代码: 运行结果: 上一篇文章:一个简单的Python暴力破解网站登录密码脚本 测试靶机为Pikachu漏洞练习平台暴力破 ...

  6. Tailscale 基础教程:Headscale 的部署方法和使用教程

    Tailscale 是一种基于 WireGuard 的虚拟组网工具,它在用户态实现了 WireGuard 协议,相比于内核态 WireGuard 性能会有所损失,但在功能和易用性上下了很大功夫: 开箱 ...

  7. vivo 海量微服务架构最新实践

    作者:来自 vivo 互联网中间件团队 本文根据罗亮老师在"2023 vivo开发者大会"现场演讲内容整理而成.公众号回复[2023 VDC]获取互联网技术分会场议题相关资料. v ...

  8. bazel 使用 gtest/gmock 报错 Constraints from @bazel_tools//platforms have been removed

    问题描述 运行 bazel test 命令,遇到错误:"Constraints from @bazel_tools//platforms have been removed. Please ...

  9. three.js中场景模糊、纹理失真的问题

    目录 1. 概述 2. 方案 2.1. 开启反走样 2.2. 开启HiDPI设置 3. 结果 4. 参考 1. 概述 在three.js场景中,有时会遇到场景模糊,纹理失真的现象,似乎three.js ...

  10. MySQL进阶篇:详解SQL性能分析

    MySQL进阶篇:第三章_SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.通过如下指令,可以查 ...