龙空技术网

Linux必学技能 | 17个案例带运维小白快速精通Awk命令,拿来即用

老男孩IT教育 612

前言:

眼前小伙伴们对“prefix24”大概比较关切,小伙伴们都想要了解一些“prefix24”的相关文章。那么小编同时在网摘上网罗了一些对于“prefix24””的相关内容,希望小伙伴们能喜欢,你们一起来了解一下吧!

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。

简单来说awk就是把文件逐行地读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。

之所以叫awk是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family Name的首字符。

awk格式:

格式: sed    -n   '3p'   sed.txt                    找谁干啥(条件动作)        awk格式#取出/etc/passwd 第1行的第1列和第3列awk  -F:   'NR==1{print $1,$3}' /etc/passwdawk  选项   '条件{动作}'    /etc/passwd 条件: 哪一行,过滤什么内容动作: print输出与显示 ,计算....
awk执行流程awk取行

与sed类似

案例01 取出sed.txt的第2行

[root@oldboy81-golden-lnb /oldboy]# cat sed.txt101,oldgirl,CEO102,zhangya,CTO103,lidao007,COO104,yy,CFO105,feixue,CIO110,lidao,COCO[root@oldboy81-golden-lnb /oldboy]# awk  'NR==2'  sed.txt102,zhangya,CTO #awk  '行号 等于 2'  sed.txt#NR awk内置变量 Number of Record  记录号(行号)
案例02 取出sed.txt中包含oldboy或lidao的行
[root@oldboy81-golden-lnb /oldboy]# sed -rn '/oldboy|lidao/p'  sed.txt103,lidao007,COO110,lidao,COCO[root@oldboy81-golden-lnb /oldboy]# awk  '/oldboy|lidao/' sed.txt103,lidao007,COO110,lidao,COCO
案例03 取出文件第2行到第5行内容
#awk   '行号大于等于2  并且  行号小于等于5' sed.txt#方法01 awk   'NR>=2  &&  NR<=5' sed.txt         #必会&& 表示并且.#方法02 sed -n '2,5p' sed.txt#方法03 了解awk  'NR==2,NR==5' sed.txt   #从行号是2的行开始 到 行号是5的行结束( 了解)
案例04 取出文件第3行到最后一行内容
[root@oldboy81-golden-lnb /oldboy]# awk  'NR >= 3' sed.txt103,lidao007,COO104,yy,CFO105,feixue,CIO110,lidao,COCO[root@oldboy81-golden-lnb /oldboy]# sed -n  '3,$p' sed.txt103,lidao007,COO104,yy,CFO105,feixue,CIO110,lidao,COCO
案例05 取出从包含oldboy的行到lidao的行
[root@oldboy81-golden-lnb /oldboy]# cat sed.txt101,oldgirl,CEO102,zhangya,CTO103,lidao007,COO104,yy,CFO105,feixue,CIO110,lidao,COCOroot@oldboy81-golden-lnb /oldboy]# sed -n '/old/,/lidao/p' sed.txt101,oldgirl,CEO102,zhangya,CTO103,lidao007,COO[root@oldboy81-golden-lnb /oldboy]# awk  '/old/ , /lidao/'  sed.txt101,oldgirl,CEO102,zhangya,CTO103,lidao007,COO
awk取行小结

awk如何找出想要行?条件:

指定行号 NR==1指定行号范围 NR>=3NR>=3 && NR<=5过滤: /oldby|lidao/范围过滤: /oldboy/,/lidao/

[root@oldboy81-golden-lnb /oldboy]# awk '/11:02:00/,/11:02:30/'  access.log |wc -l1415[root@oldboy81-golden-lnb /oldboy]# awk '/00/,/30/'  access.log |wc -l166945
awk取列

目标:熟练取出指定的内容或部分(取列)

#awk取列格式awk '{print $1,$3}'    oldboy.txt
案例01 取出ls -lh命令中的第1列和第3列
ll -h | awk '{print $1,$3}'

注意:awk 中 $数字只有一个意思,取列

案例02 取出/etc/passwd每一行内容,加上行号

#方法01 cat -n /etc/passwd #方法02 awk   '{print NR,$0}' /etc/passwdNR 表示行号.$0 表示一整行内容.
案例03 取出/etc/passwd第1列和第3列

awk取列的,默认以空格,连续空格或tab键空格分割. 只需要使用3,$6....即可取出

如果想更改或指定新的,分隔符,需要使用 -F选项

-F指定分隔符,-F指定正则

[root@oldboy81-golden-lnb /oldboy]# head /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinawk -F':'   '{print $1,$3}'  /etc/passwdawk -F':'   '{print $1,$3}'  /etc/passwd |column -t
案例04 取出ip.txt文件中ip(10.0.0.200)地址

awk中指定多个分隔符,需要使用正则匹配这多个分隔符即可

echo '    inet 10.0.0.200/24 brd 10.0.0.255 scope global ens33'  >/oldboy/ip.txt
#方法01  多个管道第1步骤: awk取第2列第2步骤: awk指定分隔符取第1列.[root@oldboy81-golden-lnb /oldboy]# cat ip.txt     inet 10.0.0.200/24 brd 10.0.0.255 scope global ens33[root@oldboy81-golden-lnb /oldboy]# awk '{print $2}' ip.txt 10.0.0.200/24[root@oldboy81-golden-lnb /oldboy]# awk '{print $2}' ip.txt  |awk -F'/' '{print $1}'10.0.0.200#方法02 awk直接取出 指定多个分隔符  ※※※※※需要使用正则###01)[root@oldboy81-golden-lnb /oldboy]# awk  -F 'inet |/24'  '{print $2}' ip.txt 10.0.0.200###02)[root@oldboy81-golden-lnb /oldboy]# cat ip.txt     inet 10.0.0.200/24 brd 10.0.0.255 scope global ens33[root@oldboy81-golden-lnb /oldboy]# awk -F '[ /]+'    '{print $3}'  ip.txt 10.0.0.200#-F '[ /]+' 先用正则匹配出连续出现的空格或/. 然后交给awk -F作为分隔符.#方法03 awk+sed.....略自己书写
案例05 取出/etc/passwd第1列,第3列和最后一列$NF 最后一列NF Number of Field 每行有多少个字段(域,列) 每行有多少列
#awk  -F':'  '{print $1,$3,$NF}'  /etc/passwdawk  -F':'  '{print $1,$3,$NF}'  /etc/passwd
awk行列综合(awk过滤进阶)精确过滤必备awk可以完成,某一列中包含/不包含内容..$3 ~ // 匹配或包含$3 !~ // 不匹配或不包含
格式:awk -F: '第3列 包含 以1或2开头的内容'  passwd #示例: 取出passwd中第3列以1或2开头内容,显示这一行awk -F:  '$3 ~ /^[12]/'   passwd 
案例01 过滤出passwd中第3列以0到3结尾的,显示第1列和第3列内容
条件: 第3列以0到3结尾 (取行)动作: 显示第1列和第3列 (取列)#方法01  分步骤awk -F: '$3~/[0-3]$/' passwd awk -F: '$3~/[0-3]$/' passwd  |awk -F: '{print $1,$3}'#方法02 awk同时取行与取列awk  -F:   'NR==1{print $1,$3}' /etc/passwdawk  选项   '条件{动作}'    /etc/passwd awk -F:   '$3~/[0-3]$/ {print $1,$3} '   passwd             条件        {动作}
案例02 过滤passwd中第3列大于0小于1000内容,显示第1列和第3列
#条件(取行): 过滤passwd中第3列大于0小于1000内容#动作(取列): 显示第1列和第3列#条件(取行): 过滤passwd中第3列大于0小于1000内容awk -F:  '$3>0 && $3<1000'  passwd#动作(取列): 显示第1列和第3列awk -F:  '$3>0 && $3<1000{print $1,$3}'  passwd awk -F:  '$3>0 && $3<1000{print $1,$3}'  passwd  |column -t 
案例03 过滤出网卡配置文件中的ip地址
/etc/sysconfig/network-scripts/ifcfg-ens33 (eth0)#李导建议: 如果要求中没有明确写出条件(eg,行号,过滤包含xxx)需要查看文件内容分析,(使用固定行号,过滤xxxx内容).[root@oldboy81-golden-lnb /oldboy]# cat -n /etc/sysconfig/network-scripts/ifcfg-ens33      1 TYPE=Ethernet     2 PROXY_METHOD=none     3 BROWSER_ONLY=no     4 BOOTPROTO=none     5 DEFROUTE=yes     6 IPV4_FAILURE_FATAL=no     7 IPV6INIT=yes     8 IPV6_AUTOCONF=yes     9 IPV6_DEFROUTE=yes    10 IPV6_FAILURE_FATAL=no    11 IPV6_ADDR_GEN_MODE=stable-privacy    12 NAME=ens33    13 UUID=8e987179-762e-466e-aa40-fe38ebb012d0    14 DEVICE=ens33    15 ONBOOT=yes    16 IPADDR=10.0.0.200    17 PREFIX=24    18 GATEWAY=10.0.0.2    19 DNS1=223.5.5.5    20 IPV6_PRIVACY=no#条件:  方法01:取出第16行       方法02:过滤包含IPADDR=的行#动作:   显示第2列(以=分割)awk #方法01 16行 [root@oldboy81-golden-lnb /oldboy]# awk -F=    'NR==16'  /etc/sysconfig/network-scripts/ifcfg-ens33IPADDR=10.0.0.200[root@oldboy81-golden-lnb /oldboy]# awk -F=    'NR==16 {print $2}'  /etc/sysconfig/network-scripts/ifcfg-ens3310.0.0.200#方法02 过滤IPADDRawk -F=    '/IPADDR/ {print $2}'  /etc/sysconfig/network-scripts/ifcfg-ens33sed#方法01 16行 [root@oldboy81-golden-lnb /oldboy]# sed -n '16p'  /etc/sysconfig/network-scripts/ifcfg-ens33IPADDR=10.0.0.200[root@oldboy81-golden-lnb /oldboy]# sed -n '16p'  /etc/sysconfig/network-scripts/ifcfg-ens33|sed 's#^.*=##g'10.0.0.200[root@oldboy81-golden-lnb /oldboy]# sed -n '16 s#^.*=##g  p'  /etc/sysconfig/network-scripts/ifcfg-ens3310.0.0.200[root@oldboy81-golden-lnb /oldboy]# [root@oldboy81-golden-lnb /oldboy]# ip a s ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 00:0c:29:e8:3a:6f brd ff:ff:ff:ff:ff:ff    inet 10.0.0.200/24 brd 10.0.0.255 scope global ens33       valid_lft forever preferred_lft forever    inet6 fe80::20c:29ff:fee8:3a6f/64 scope link        valid_lft forever preferred_lft forever[root@oldboy81-golden-lnb /oldboy]# ip a s ens33 |sed -n '3p'     inet 10.0.0.200/24 brd 10.0.0.255 scope global ens33[root@oldboy81-golden-lnb /oldboy]# ip a s ens33 |sed -n '3p' |sed -r  's#^.*et (.*)/.*$#\1#g'10.0.0.200[root@oldboy81-golden-lnb /oldboy]# [root@oldboy81-golden-lnb /oldboy]# ip a s ens33 |sed -nr '3  s#^.*et (.*)/.*$#\1#g  p' 10.0.0.200#方法02 过滤IPADDRsed -n '/IPADDR/ s#^.*=##g  p'  /etc/sysconfig/network-scripts/ifcfg-ens33
awk统计计算功能BEGIN{}和END{}awk中的特殊的条件(模式),pattern这两个特殊的条件,都与计算相关,最常用的是END{}

特殊条件(模式)

含义

应用场景

BEGIN{}

BEGIN{}内容会在awk读取文件之前执行

1. 里面进行实验;2.进行计算,不需要读取文件内容;3. 创建或修改awk变量

END{}

END{}内容会在awk读取文件之后执行

1. awk在读取文件的时候进行统计与计算. 最后统计完成在END{}输出最终结果

BEGIN{}

#计算  1/3 + -  *  /[root@oldboy81-golden-lnb /oldboy]# awk   'BEGIN{ print 1/3}'   0.333333[root@oldboy81-golden-lnb /oldboy]# awk   'BEGIN{ print 1/3,1-3,1+3,3*3}'   0.333333 -2 4 9[root@oldboy81-golden-lnb /oldboy]# awk   'BEGIN{ print 1/3,1-3,1+3,3*3,2^10}'   0.333333 -2 4 9 1024#修改awk变量 了解awk -F: 'NR==1{print $1}'  passwd awk   'BEGIN{FS=":"} NR==1{print $1}'  passwd 
END{}案例01 统计/etc/passwd的行数
wc -l /etc/passwd #条件: 无#动作: i++  #统计次数,类似于wc -lawk  '{i++}'   /etc/passwd#输出最后i内容.awk  '{i++} END{print i}'   /etc/passwd#完成#详解 i++ i=i+1   === i++   #功能用于计数,统计有多少次,一共出现的次数.... 类似于 wc -l cat num.txtabcdeawk  '{i++} END{print i}' num.txt        之前的i内容    i=i+1    之后i的内容   读1行     空/0        i=0+1       1第2行      1          i=1+1       2第3行      2          i=2+1       3第4列      3          i=3+1       4.......
案例02 统计/etc/passwd中可登录用户数量
可登录的用户: 命令解释器是/bin/bash#条件: 命令解释器是bash #动作: c++  #统计次数,类似于wc -l#输出最后次数/数量.END{print c}#条件: 命令解释器是bash  awk  '        {i++}  END{print i}'   /etc/passwd awk  '/bash$/ {c++}  END{print c}'   /etc/passwd  #awk执行的时候,统计的时候 输出过程 熟悉 awk  '/bash$/ {c++;print c}  '  passwd 
案例03 统计/etc/services文件中空行的数量
#条件:  过滤空行  ^$#动作:  j++  #统计次数,类似于wc -l#输出最后次数/数量.[root@oldboy81-golden-lnb /oldboy]# #awk '/^$/' /etc/services  [root@oldboy81-golden-lnb /oldboy]# [root@oldboy81-golden-lnb /oldboy]# awk '/^$/{j++} ' /etc/services  [root@oldboy81-golden-lnb /oldboy]# [root@oldboy81-golden-lnb /oldboy]# awk '/^$/{j++} END{print j}' /etc/services  17
案例04 生产工作案例 统计access.log中一共用了多少流量
文件中记录着用户每天流量.求和,累加.cat > liu.log<<EOF150.510100200300EOFi=i+1    ==  i++sum=sum+$1或$0       之前的sum内容    sum=sum+$1   之后sum的内容   第1行       0          sum=0+1          1第2行       1          sum=1+5          6第3行       6          sum=6+0.5        6.5第4行      6.5         sum=6.5 + 10     16.5 sum=sum+$xxx   #累加或求和.[root@oldboy81-golden-lnb /oldboy]# cat liu.log 150.510100200300[root@oldboy81-golden-lnb /oldboy]# awk  '{sum=sum+$1} END{print sum}' liu.log 616.5
#案例04 生产工作案例统计access.log中一共用了多少流量.第1列是ip地址第4列是时间 第10列是流量(字节) #条件:     无#动作:     {sum=sum+$10}#最后输出: END{print sum}[root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum}'  access.log 2478496663[root@oldboy81-golden-lnb /oldboy]# [root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum/1024}'  access.log 2.42041e+06[root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum/1024/1024}'  access.log 2363.68[root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum/1024/1024/1024}'  access.log 2.30828[root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum/1024^3}'  access.log 2.30828[root@oldboy81-golden-lnb /oldboy]# awk '{sum=sum+$10}  END{print sum/1024^3"GB"}'  access.log 2.30828GB
awk常见环境变量

环境变量

含义

NR

行号

NF

每行有多少列

$NF

表示最后一列

$数字

2 取出某一列或某几列. 一般配合-F一起使用

$0

每行的所有列(一整行内容)

FS

field separator字段(列)分隔符,分隔符.-F背后修改的内容

标签: #prefix24 #csstable行号