ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux awk工具的使用

2022-07-19 00:02:40  阅读:214  来源: 互联网

标签:分隔符 指定 program awk linux print 工具 NR


awk的由来

awk这个工具的名字是由三个发明者的首字母缩写。是一个文本处理工具。

awk的版本

最早AWK是属于被而是实验室的,后来就出现了很多衍生的版本。

#linux用的是GUN的awk,即GAWK,和AWK是兼容的。

which awk #查看awk这个命令所在的位置
ll /usr/bin/awk #awk是一个软连接,只想GAWK

awk最基本的功能

把文件的内容进行取列处理,处理逻辑类似于grep和sed,也是逐行处理,每一次读取文件的一行,处理完后再读取下一行。

会把读入的一行按照一个的条件分割成列 #默认使用空格作为分隔符

awk的语法格式

#格式一:
awk [options]   'program' var=value   file…
#awk [选项] '程序代码' 需要处理的文件

#格式二:
awk [options]   -f programfile    var=value file…

#program:程序代码,是awk的处理语言,通过program来定义如何处理某行的内容
#file:表示需要处理的文件

#选项:
-F:用于指定分隔符  #例如:-F"|" 表示使用|作为每行的分隔符
-v:用于指定变量

awk的program

awk 的 program 参数由 pattern 和 action 组成。

Pattern 用于指定匹配模式,并对匹配的行执行后面的 action 操作,不匹配的行不做处理。

Action 用于指定要对匹配到的行进行什么样的操作,这些操作语句要包含在大括号 {} 里面。

#如果没有提供 pattern 参数,默认处理所有行。

注意:
#program需要用单引号括起来

#常见的action动作:print

        #pattern省略或为1,等价于 /.*/
        #action省略,等价于 { print }
        #program就是由pattern和action组成的

awk的工作过程

  • 第一步:执行begin语句块:在文件处理之前所作的操作

  • 第二步:读入文件的每一行进行处理

  • 第三步:文件处理完成之后执行end的语句块

awk program的动作 print

print这个动作可以实现打印的功能。 使用分隔符将一行切成若干列,用S1..$n来表示第几列 $0表示整行

#格式:
print item1, item2, ...
#每个分组之间使用逗号作为分隔符
#如果没有item,只有一个print动作,默认为:print $0
#print打印字符串要用双引号括起来,不然就会认为是要给变量,数字不用加双引号,变量和数字不需要

范例

#例如:获取分区的利用率
df -h | awk '{print $5}'

df  | awk -F"[ %]+" '{print$1,$5}' #[ %]+:表示以一个以上空格或百分号作为分隔符


#例如:取出网站访问量最大的前3个IP
awk '{print $1}' nginx.access.log-20200428 |sort | uniq -c |sort -nr|head -3

#sort命令:实现排序的功能(默认从小到大)
选项:
-n:以字符串的数字作为排序的一句
-r:将要比较的结果反转 #逆序排序 最大的排最前面

#uniq命令:用于去除重复的行
选项:
-c:在每一行的前面显示统计改行出现过的次数
-d:仅显示重复的行
-u:仅显示不重复的行

#head命令:显示文件指定的前几行
-n num或 -num:显示文件的开头num行

#例如:获取指定网卡的ip地址
ifconfig eth0 | sed -n '2p' | awk '{print $2}'

#sed命令:对指定的行进行操作,
-n:关闭自动打印功能
脚本位置:
2:表示第二行

脚本指定:
p:表示打印指定的行内容

awk中的变量

  • 内置变量

  • 外置变量

内置变量

awk的program中引用变量,不需要添加$符号

FS:执行字段的分隔符,相当于-F选项
例如: awk -v FS=":" #指定冒号作为每行分段的分隔符

对变量赋值需要使用awk的-v选项;
格式:awk -v 变量名=值
OFS:指定输出字段的分隔符,FS值指定输入字段的分隔符。默认的都是空格
NF:字段数量
  • 行;称为记录

  • 列:称为字段或者域

NF:一行有多少列
NR:记录的编号

NR:第几行的编号,比如第四行,NR就是4

范例:获取指定网卡的ip地址
ifconfig eth0 | awk 'NR==2{print $2}' #表示取第二行的内容 NR==2就是条件
FNR:对多个文件进行单独的编号

使用NR的话就是把多个文件合在一起进行编号。
image

FILENAME:当前文件名

自定义变量

自定义变量的格式:-v 变量名=值

awk的PATTERN

  • 没指定pattern

  • 匹配指定的行

  • 匹配一个范围

不指定pattern
没有写pattern:表示空模式,所有的行都匹配(大括号前面没任何条件内容)
匹配指定的行:
/正则表达式/:过滤符合正则表达式的行进行打印 --和sed的使用方法一样的

#范例:ifconfig eth0 | awk '/netmask/{print }' 
匹配一个范围:
  • 正则表达式写法

  • 内置变量NR写法


行的区间范围:不能直接写行号,使用NR变量
#例如: NR>=5 && NR <=8 --- 第五行到第八行

正则表达式的写法: /pattern1/,/pattern2/

awk的操作符

  • 算数操作符

  • 模式匹配符

  • 逻辑操作符

算数操作符:> < == != >= <= % =(赋值)

#范例:取奇,偶数行
#seq 10 | awk 'NR%2==0'
seq 10 | awk 'NR%2==1'

模式匹配符:

  • ~ 左边是否和右边匹配,包含关系

  • !~ 是否不匹配

awk -F: '$0 ~ /root/{print $1}' /etc/passwd #表示包含root的行

逻辑操作符:

  • 与:&&,并且关系

  • 或:||,或者关系

  • 非:!,取反

#例如:awk -F:  '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd

关系表达式:结果为真才进行处理

  • 真:结果为非0值或非空字符串

  • 假:结果为空字符串或0值

标签:分隔符,指定,program,awk,linux,print,工具,NR
来源: https://www.cnblogs.com/heyongshen/p/16492480.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有