awk 基本应用

grep和egrep:文本过滤

sed:流编辑器,实现编辑的(行编辑处理)

awk:文本报告生成器,实现格式化文本输出(列编辑处理)

概念

awk是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter 、Weinberger和brian kernighan三个人的姓的缩写。

    awk---->gawk 即: gun awk

在linux上常用的是gawk,awk是gawk的链接文件

man gawk----》pattern scanning and processing language  模式扫描和处理语言。

pattern [ˈpætn]  模式    ; process [ˈprəʊses] 处理

    任何awk语句都是由模式动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

模式可以包括:

正则表达式 :   /root/ 匹配含有root的行          /*.root/

关系表达式:   <  >  &&  ||   +  *

匹配表达式:   ~  !~

动作:

变量  命令  内置函数  流控制语句

它的语法结构如下:

awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file

其中:BEGIN  END是AWK的关键字部,因此必须大写;这两个部分开始块和结束块是可选的

image.png特殊模块:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行

END语句输出统计结果,在完成动作之后执行

image.png

通过上面我们可以知道;AWK它工作通过三个步骤

1、读:从文件、管道或标准输入中读入一行然后把它存放到内存中

2、执行:对每一行数据,根据AWK命令按顺序执行。默认情况是处理每一行数据,也可以指定模式

3、重复:一直重复上述两个过程直到文件结束

AWK支持两种不同类型的变量:内建变量,自定义变量

awk内置变量(预定义变量)

√  $n 当前记录的第n个字段,比如: $1表示第一个字段,$2表示第二个字段

√  $0 这个变量包含执行过程中当前行的文本内容

√  FILENAME 当前输入文件的名

√  FS 字段分隔符(默认是空格)

√  NF 表示字段数,在执行过程中对应于当前的字段数,NF:列的个数

√  FNR  各文件分别计数的行号

√  NR 表示记录数,在执行过程中对应于当前的行号

√  OFS 输出字段分隔符(默认值是一个空格)

√  ORS 输出记录分隔符(默认值是一个换行符)

√  RS 记录分隔符(默认是一个换行符)

image.png

实例演示

常用的命令选项:

       -F  fs指定分隔符

       -v 赋值一个用户自定义变量

       -f 指定脚本文件,从脚本中读取awk命令

(1)分隔符的使用

用法:-Ffs 其中fs是指定输入分隔符,fs可以是字符串或正则表达式;分隔符默认是空格

常见写法:-F:   -F,  -F[Aa]

例1:

[root@xuegod63 ~]# echo "AA BB CC DD"|awk '{print $2}'

BB

[root@xuegod63 ~]# echo "AA|BB|CC|DD"|awk -F"|" '{print $2}'

BB

[root@xuegod63 ~]# echo "AA,BB,CC,DD"|awk -F"," '{print $2}'

BB

[root@xuegod63 ~]# echo "AA,BB,CC,DD"|awk -F, '{print $2}'

BB

[root@xuegod63 ~]# awk -F: '{print $1}' /etc/passwd  #以:分隔,打印第1列用户名

例2:指定多个分隔符

[root@xuegod63 ~]# echo "12AxAbADXaAD52" | awk -F"aA" '{print $1}'

12AxAbADX

[root@xuegod63 ~]# echo "12AxAbADXaAD52" | awk -F"[aA]" '{print $6}'

D52


例3:使用FS指定分隔符

[root@xuegod63 ~]# echo "12AxAbADXaAD52" | awk 'BEGIN {FS="aA"} {print $2}'

D52

 

例4:过滤出本系统的IP地址

[root@xuegod63 ~]# ifconfig ens33 | grep netmask

        inet 192.168.1.63  netmask 255.255.255.0  broadcast 192.168.1.255

[root@xuegod63 ~]# ifconfig ens33 | grep netmask | awk '{print $2}'

192.168.1.63

 关系运算符的使用

例1:

[root@xuegod63 ~]# echo "3 2 3 4 5" > a.txt

[root@xuegod63 ~]# awk '{print $1+10}'  a.txt

13

例2:

[root@xuegod63 ~]# echo "one two three four" | awk '{print $4}'

four

[root@xuegod63 ~]# echo "one two three four" | awk '{print $NF}'        #打印最后一列

four

[root@xuegod63 ~]# echo "one two three four" | awk '{print $(NF-2)}'  #打印倒数第3列

two

[root@xuegod63 ~]# echo "one two three four" | awk '{print $(NF/2-1)}'

one

例2:打印出passwd文件中用户UID小于10的用户名和它登录使用的shell

参数: $NF 最后一列

[root@xuegod63 ~]# awk -F: '$3<10{print $1 $NF}' /etc/passwd  #直接输出格式太乱

root/bin/bash

bin/sbin/nologin

daemon/sbin/nologin

adm/sbin/nologin

lp/sbin/nologin

sync/bin/sync

shutdown/sbin/shutdown

halt/sbin/halt

mail/sbin/nologin

[root@xuegod63 ~]# awk -F: '$3<10{print $1 "<======>" $NF}' /etc/passwd #awk格式化输出

root<======>/bin/bash

bin<======>/sbin/nologin

daemon<======>/sbin/nologin

在$1和$NF之间加一下\t tab

[root@xuegod63 ~]# awk -F: '$3<10{print $1"\t"$NF}' /etc/passwd 

注:awk 最外面使用了单引号'' ,里面都使用双引号“”

 image.png

.输出多个列时,可以加,分隔一下.

[root@xuegod63 ~]# awk -F: '$3<10{print $1,$NF}' /etc/passwd

 

例2:打印出系统中UID大于1000且登录shell是/bin/bash的用户

[root@xuegod63 ~]#  awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1"\t"$NF}' /etc/passwd

mk  /bin/bash

 image.png

在脚本中的一些应用

例:统计当前内存的使用率

[root@xuegod63 ~]#

[root@xuegod63 ~]# cat user_cache.sh

#!/bin/bash
echo "当前系统内存使用百分比为:"
USEFREE=`free -m | grep -i mem | awk '{print $3/$2*100"%"}'`
echo -e "内存使用百分比: \e[31m${USEFREE}\e[0m"

 

[root@xuegod63 ~]# bash user_cache.sh

image.png

版权声明:
作者:WaterBear
链接:https://l-t.top/1672.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>