我的编程空间,编程开发者的网络收藏夹
学习永远不晚

awk命令详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

awk命令详解

目录

一、awk概述

1.工作原理

2.语法格式

 3.awk常用的内建变量

二、按行输出文本

1.输出所有内容

2.输出指定行号的内容

3.输出奇偶行内容

4.输出匹配行的行内容

二、按字段输出文本

1.输出指定字段

2.输出结果指定分隔符

2.1OFS指定输出结果分隔符

3.输出匹配字段的行内容

4.三元运算符

三、通过管道符、双引号调用shell命令

1.统计行数

2.查看当前内存使用百分比

3.查看当前cpu空闲率

4.显示系统上次重启时间

5.getline的使用

四、BEGIN,END模式

 1.awk数组

2.过滤文本中重复行数

3.过滤访问本机密码输入失败的命令


一、awk概述

AWK是一种处理文本文件的语言,是一个强大的文件分析工具。

它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。

1.工作原理

awk逐行读取文本,默认以空格或Tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或条件执行编辑命令。

与sed命令相比:

  • sed命令常用于一整行的处理。
  • awk命令倾向于将一行分成多个“字段” 然后再进行处理。awk信息的读入是逐行读取的,执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符“&&”表示“与”,“||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

2.语法格式

awk 选项 '模式或条件 {操作}' 文件1 文件2awk -f 脚本文件 文件1 文件2

 3.awk常用的内建变量

FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同OFS:输出分隔符。指定输出字段间的分隔符。RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)NF:当前处理行的字段个数NR:当前处理行的行号FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件$0:当前处理行的整行内容$n:当前处理行的第 n 个字段(第 n 列)FILENAME:被处理的文件名

二、按行输出文本

1.输出所有内容

awk '{print}' a.txt   或awk '{print $0 }' a.txtabctwothreefourfivesixseveneightnineteneleventwelve

2.输出指定行号的内容

#打印1-3行的行内容awk 'NR==1,NR==3{print $0}' a.txtonetwothree#打印1-3行的行内容,&&表示“与”awk '(NR>=1)&&(NR<=3){print $0}' a.txtonetwothree#打印第1行或第3行的行内容,|| 表示“或”awk 'NR==1||NR==3{print $0}' a.txtonethree#打印行号小于4的行内容,!表示取反awk '!(NR>4){print $0}' a.txtonetwothreefour

3.输出奇偶行内容

#输出奇数行,行号取余=1为奇数行awk '(NR%2)==1{print $0}' a.txtonethreefivesevennineeleven#输出偶数行awk '(NR%2)==0{print $0}' a.txttwofoursixeighttentwelve

4.输出匹配行的行内容

#输出以 n 开头的行内容awk '/^n/{print $0}' a.txtnine#输出以 e 结尾的行内容awk '/e$/{print $0}' a.txtonethreefiveninetwelve

二、按字段输出文本

1.输出指定字段

# -F 指定分隔符;$1 所在行以分隔符分隔的第一个字段awk -F ":" '{print $1}' passwdrootdaemonadmynamedlisiapachedhcpd# $NF 表示所在行最后一个字段,NR 表示当前行的行号awk -F ":" '{print NR,$NF }' passwd1 /bin/bash2 /sbin/nologin3 /sbin/nologin4 /bin/bash5 /sbin/nologin6 /bin/bash7 /sbin/nologin8 /sbin/nologin

2.输出结果指定分隔符

#输出第1和第3个字段,输出结果默认以 空格 分隔awk -F ":" '{print $1,$3 }' passwdroot 0daemon 2adm 3y 1000named 25lisi 1001apache 48dhcpd 177awk -F ":" '{print $1","$3 }' passwdroot,0daemon,2adm,3y,1000named,25lisi,1001apache,48dhcpd,177awk -F ":" '{print $1"=="$3 }' passwdroot==0daemon==2adm==3y==1000named==25lisi==1001apache==48dhcpd==177

2.1OFS指定输出结果分隔符

echo 'A B C D' | awk '{OFS=":";print $0}'A B C D# $1=$1 用来激活$0的重新赋值,通常是在改变OFS后而需要输出$0时这样做echo 'A B C D' | awk '{OFS=":";$1=$1;print $0}'A:B:C:D

3.输出匹配字段的行内容

cat passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologiny:x:1000:1000:y:/home/y:/bin/bashnamed:x:25:25:Named:/var/named:/sbin/nologinlisi:x:1001:1001::/home/lisi:/bin/bashapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologindhcpd:x:177:177:DHCP server:/:/sbin/nologin#输出第3字段大于50的行的第1和第3字段awk -F ":" '$3>50{print $1,$3}' passwdy 1000lisi 1001dhcpd 177#输出第7字段中包含/bash的行内容awk -F ":" '$7~"/bash"{print $0}' passwdroot:x:0:0:root:/root:/bin/bashy:x:1000:1000:y:/home/y:/bin/bashlisi:x:1001:1001::/home/lisi:/bin/bash

4.三元运算符

条件表达式?值1:值2

若条件表达式成立,则取值1;反之,取值2。

awk -F ":" '{print $3,$4}' passwd0 02 23 41000 100025 251001 100148 48177 177#三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,#否则第4个字段的值赋给maxawk -F ":" '{max=($3>=$4)?$3:$4;{print max}}' passwd024100025100148177

三、通过管道符、双引号调用shell命令

1.统计行数

awk -F ":" '/bash$/{print}' passwd root:x:0:0:root:/root:/bin/bashy:x:1000:1000:y:/home/y:/bin/bashlisi:x:1001:1001::/home/lisi:/bin/bash#调用 wc -l 统计使用bash的行数awk -F ":" '/bash$/{print|"wc -l"}' passwd 3

2.查看当前内存使用百分比

#查看当前内存使用百分比free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'87%

3.查看当前cpu空闲率

# -b -n 1 表示只需要1次输出结果top -b -n 1 | grep Cpu%Cpu(s):  2.9 us,  2.9 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 #输出cpu空闲率的字段top -b -n 1 | grep Cpu | awk -F "," '{print $4}'96.9 id#输出Cpu空闲率top -b -n 1 | grep Cpu | awk -F "," '{print $4}' | awk '{print$1}'96.9

4.显示系统上次重启时间

date -d      #显示字符串所指的日期与时间。字符串前后必须加上双引号

date +"%Y-%m-%d"      #注意 :+ 和格式之间没有空格

常用格式:

%F:完整日期格式,等价于%Y-%m-%d

%Y:年份

%m:月份

%d:按月计的日期

%T:时间,等于%H:%M:%S

%H: 小时,24小时制(00~23)

%M:分钟

%S:秒

#查看当前时间date 2023年 05月 15日 星期一 16:24:53 CST#显示当月的第一天date +"%Y%m01"20230501#显示一天前date -d "1 day ago" +%F2023-05-14#显示当月的倒数第三天,1 month 表示下个月的今天,-3 day 表示三天前date -d "$(date -d "1 month" +"%Y%m01")-3 day" +"%Y%m%d"20230529#查看上次系统重启时间#/proc/uptime 第一列输出的是,系统启动到现在的时间(以秒为单位);#第二列输出的是,系统空闲的时间(以秒为单位)date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"2023-05-11 02:15:22

5.getline的使用

当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,即隔行输出。然后将它打印出来
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

#当有重定向符号或 “|” 时,只会输出第1行awk 'BEGIN {"cat a.txt" |getline; {print }}'one#当有重定向符号或 “|” 时,输出奇数行cat a.txt | awk '{print $0;getline}'onethreefivesevennineeleven#输出偶数行cat a.txt | awk '{getline;print $0}'twofoursixeighttentwelve

四、BEGIN,END模式

BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。

END模式:在处理指定文本结束后,需要执行END模式中的指定操作

awk '/e$/{print $0}' a.txtonethreefiveninetwelve#统计以 e 结尾的行awk 'BEGIN{x=0}; /e$/{x++};END{print x}' a.txt5#先处理完BEGIN的内容,再打印文本里面的内容awk 'BEGIN{FS=":"};{if($3>=20){print}}' passwdy:x:1000:1000:y:/home/y:/bin/bashnamed:x:25:25:Named:/var/named:/sbin/nologinlisi:x:1001:1001::/home/lisi:/bin/bashapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologindhcpd:x:177:177:DHCP server:/:/sbin/nologin#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'1 /usr/local/sbin2 /usr/local/bin3 /usr/sbin4 /usr/bin5 /root/bin5

 1.awk数组

#BEGIN中的命令只执行一次awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;print a[2]}'3#awk数组的下标除了数字,还可以使用字符串,字符串需要使用双引号awk 'BEGIN{a["q"]="aaa";a["m"]="bbb";a["y"]="ccc";print a["q"]}'aaaawk 'BEGIN{a["q"]=1;a["m"]=2;a["y"]=3;for(i in a){print i,a[i]}}'y 3m 2q 1

2.过滤文本中重复行数

cat b.txtaaabbbcccaaaaaaaaabbbbbbccc#将文本的内容作为数组下标,a[$1]++表示出现相同的行,就自加1awk '{a[$1]++}END{for (i in a){print i,a[i]}}' b.txtaaa 4ccc 2bbb 3

3.过滤访问本机密码输入失败的命令

#过滤密码输出错误的IP地址及输入次数awk '/Failed password/{ip[$11]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure 192.168.88.121 4192.168.88.20 6#过滤输入次数大于4次的IP地址awk '/Failed password/{ip[$11]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure | awk '$2>4{print $1}'192.168.88.20

来源地址:https://blog.csdn.net/q1y2y3/article/details/130683036

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

awk命令详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-10-21

Linux awk 命令详解

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符awk是一个强
2023-06-05

详解Linux中的awk命令

简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk有3个不同版本:
2022-06-04

linux awk时间计算脚本及awk命令详解

在linux如果计划时间是个麻烦事, 用awk脚本如下BEGIN {FS=":";OFS=":"}{total_seconds=total_seconds+$3}total_seconds>=60 {total_seconds=total_
2022-06-04
2024-04-02
2024-04-02
2024-04-02

awk命令、awk编程语言详细介绍和实例

一,什么是awk awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。他读取输出,或者文件的方式是一行,一行的读,根据你给出的条
2022-06-04

Linux中的awk命令全解析

Linux中的awk命令详解,是一种文本处理工具,语法简洁,内置函数丰富。常用命令包括字段命令、比较运算符、逻辑运算符和内置函数。条件语句和循环语句可用于复杂操作。示例包括从日志中提取IP地址、计算CSV文件平均年龄和从XML中提取特定节点值。高级用法还包括自定义函数、数组和正则表达式。awk功能强大,可满足各种文本处理需求。
Linux中的awk命令全解析
2024-04-02

一天一个shell命令 linux文本内容操作系列-awk命令详解

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk有3个不同版本
2022-06-04

awk命令如何使用

今天小编给大家分享一下awk命令如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Awk模式Awk支持不同类型的模式,包
2023-06-27

Linux命令学习手册-awk

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename功能相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。描述awk 的处理流程读入第一行,并将第一行的资料填入 $0
2023-06-05

Linux中“awk”命令的用法

Linux中“awk”命令的用法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符
2023-06-05

linux中awk命令怎么用

这篇文章给大家分享的是有关linux中awk命令怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。awk是一种模式扫描和处理语言,在对数据进行分析处理时,是十分强大的工具。awk [options] patte
2023-06-09

linux awk命令如何使用

今天小编给大家分享一下linux awk命令如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-02-02

Unix中awk命令怎么用

小编给大家分享一下Unix中awk命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!awk 命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简
2023-06-16

如何理解awk编程及相关命令

这篇文章主要讲解了“如何理解awk编程及相关命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解awk编程及相关命令”吧!一,什么是awkawk是linux下的一个命令,他对其他命令的
2023-06-09

编程热搜

目录