Linux三剑客命令—awk

编程

一、概念说明

官方概念说明:

gawk - pattern scanning and processing language

模式扫描和处理文件语言

AWK 是一种处理文本文件的语言,主要是用来格式化文本,是一个强大的文本分析工具。

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

二、awk功能应用说明

  • 处理文件信息

    • 文本文件信息
    • 日志文件信息
    • 配置文件信息

  • 处理文件方式

    • 排除信息
    • 查询信息
    • 统计信息
    • 替换信息

三、awk语法原理

3.1 命令语法格式

  • 标准格式:

    awk [选项] "模式{动作}" [文件信息]

    awk [参数] [处理规则] [操作对象]

    参数:

    -F : 指定文本分隔符(默认是以空格作为分隔符)

    eg:打印系统所有用户的解析器

    awk -F: "{print $NF}" /etc/passwd

  • 模式说明(匹配信息):

    • 普通模式(定位)

      1. 正则表达式模式

        eg: 打印以root开头的行 

        [root@localhost ~]# awk -F: "/^root/{print $0}" /etc/passwd

      2. 比较表达式模式

        相关符号:

        >

        <

        >=

        <=

        ~ :正则匹配

        !~ :正则匹配(取反)

        eg:要求打印属组ID大于属主ID的行

        [root@localhost ~]# awk -F: "$4 > $3{print $0}" /etc/passwd

        eg:结尾包含bash

        [root@localhost ~]# awk -F: "$NF ~ /bash/{print $0}" /etc/passwd

        eg:结尾不包含bash

        [root@localhost ~]# awk -F: "$NF !~ /bash/{print $0}" /etc/passwd

      3. 逻辑表达式模式

        相关符号:

        && : 逻辑与

        || :逻辑或

        ! :逻辑非

        eg:要求属组 + 属主的ID 大于 2000 并且属组 * 属主的ID 大于 2000

        [root@localhost ~]# awk -F: "$3 + $4 > 2000 && $3 * $4 > 2000{print $0}" /etc/passwd

        eg:要求属组 + 属主的ID 大于 2000 或者属组 * 属主的ID 大于 2000

        [root@localhost ~]# awk -F: "$3 + $4 > 2000 || $3 * $4 > 2000{print $0}" /etc/passwd

        eg:要求属组 + 属主的ID 不大于 2000 (小于等于2000)

        [root@localhost ~]# awk -F: "!($3 + $4 > 2000){print $0}" /etc/passwd

      4. 算术表达式模式

        相关符号:

        +

        -

        *

        /

        %

        eg:要求属组 + 属主的ID 大于 2000

        [root@localhost ~]# awk -F: "$3 + $4 > 2000{print $0}" /etc/passwd

        eg:要求属组 * 属主的ID 大于 2000

        [root@localhost ~]# awk -F: "$3 * $4 > 2000{print $0}" /etc/passwd

        eg:要求打印偶数行

        [root@localhost ~]# awk -F: "NR % 2 == 0{print $0}" /etc/passwd

        eg:要求打印奇数行

        [root@localhost ~]# awk -F: "NR % 2 == 1{print $0}" /etc/passwd

      5. 条件表达式模式

        相关符号:

        ==

        >

        <

        >=

        <=

        eg:要求打印第三行

        [root@localhost ~]# awk -F: "NR == 3{print $0}" /etc/passwd

      6. 范围表达式模式

        eg:打印以root开头到以ftp开头的行

        [root@localhost ~]# awk -F: "/^root/,/^ftp/{print $0}" /etc/passwd

    • 特殊模式

      • BEGIN{}

        概念说明:括号里面的内容会在awk读取文件之前执行

        awk "BEGIN{print "oldboy"}{print $0}" reg.txt 

        作用说明:

        用于测试

        用于计算

        修改内置变量

      • END{}

        概念说明:括号里面的内容会在awk读取文件之后执行

        awk "{print $0}END{print "end of file"}" reg.txt  

        作用说明:

        显示计算最终结果

        用于计算

  • 内置变量

    $0	: 代表当前行

    [root@localhost ~]# awk -F: "{print $0, "---"}" /etc/passwd

    $n :代表第n列

    [root@localhost ~]# awk -F: "{print $1}" /etc/passwd

    NF :记录当前行的字段数(表示每一行有多少列)

    [root@localhost ~]# awk -F: "{print NF}" /etc/passwd

    [root@localhost ~]# awk -F: "{print $NF}" /etc/passwd

    NR :用来表示行号信息

    [root@localhost ~]# awk -F: "{print NR}" /etc/passwd

    FS :指定文本内容分隔符(默认是空格)

    [root@localhost ~]# awk "BEGIN{FS=":"}{print $NF, $1}" /etc/passwd

    OFS :指定打印分隔符(默认空格)

    [root@localhost ~]# awk -F: "BEGIN{OFS=" >>> "}{print $NF, $1}" /etc/passwd

    FS 的优先级要高于 -F:-F ":" ==>BEGIN{FS=":"} ==> -vFS=":"

3.2 命令执行过程

grep、sed和awk都是读一行处理一行,直至处理完成。

awk的生命周期如下:

  1. 接收一行作为输入;
  2. 把刚刚读入进来得到的文本进行分解;
  3. 使用处理规则处理文本;
  4. 输入一行,赋值给$0,直至处理完成;
  5. 把处理完成之后的所有的数据交给END{}来再次处理;

四、awk实践操作

4.1 实践环境创建

cat >>./reg.txt<<EOF

Zhang Dandan 41117397 :250:100:175

Zhang Xiaoyu 390320151 :155:90:201

Meng Feixue 80042789 :250:60:50

Wu Waiwai 70271111 :250:80:75

Liu Bingbing 41117483 :250:100:175

Wang Xiaoai 3515064655 :50:95:135

Zi Gege 1986787350 :250:168:200

Li Youjiu 918391635 :175:75:300

Lao Nanhai 918391635 :250:100:175

EOF

4.2 命令操作实践

  • 查询实践

    查找实践参数:

    指定列的分隔符号(参数): -F ""

    显示指定行号信息(模式): NR==

    显示指定列的信息(动作): print

    案例说明:

    按行查找文件数据信息:

    awk "NR==1" reg.txt

    awk "/250/" reg.txt

    按行按列查找文件信息:

    awk -F":" "NR==1{print $1}" reg.txt

    awk -F":" "NR==1{print $1,$2}" reg.txt

    awk -F":" "$3~/0+/" reg.txt

    ~ 在awk中表示匹配或者包含什么信息;

    !~ 在awk中表示不匹配或者不包含什么信息;

  • 查询测验(显示指定行的指定列的信息)

    1. 显示xiaoyu的姓氏和ID号码

      条件是什么: 找出第二列包含xiaoyu的信息

      动作是什么: 显示xiaoyu这行指定列信息

      实践操作:

      awk "$2~/Xiaoyu/{print $1,$3}" reg.txt

    2. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字

      条件是什么: 找出第一列包含zhang的信息

      动作是什么: 显示zhang这行指定列信息

      实践操作:

      awk -F "[ :]+" "$1~/Zhang/{print $1 $2,$5}" reg.txt

      awk -F "[ :]+" "$1~/Zhang/{print $1 $2,$(NF-1)}" reg.txt

    3. 显示所有以41开头的ID号码的人的全名和ID号码

      条件是什么: 显示以41开头的ID号

      动作是什么: 显示41开头号码,人的全名的对应列

      实践操作:

      awk "$3~/^41/{print $1 $2,$3}" reg.txt

    4. 显示所有ID号码最后一位数字是1或5的人的全名

      条件是什么: 以1或5结尾的ID号码

      动作是什么: 显示人的全名对应列

      实践操作:

      awk "$3~/[15]$/{print $1 $2}" reg.txt

      awk "$3~/(1|5)$/{print $1 $2}" reg.txt

      awk "$3~/1$|5$/{print $1 $2}" reg.txt

    5. 显示Xiaoyu的捐款信息,并以$开头, 如:$110$220$330

      条件是什么: 找出xiaoyu的信息

      动作是什么: 显示捐款信息,在数值前赋予$

      实践操作:

      awk "$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}" reg.txt

      gsub 是一个函数。

  • 特殊模式应用案例

    1. 统计/etc/services文件中空行数量

      grep应用:

      grep "^$" /etc/services|wc -l

      grep -c "^$" /etc/services

      awk应用:

      awk "/^$/{i++}END{print i}" /etc/services (表示前面先计算,最后通过END将结果进行显示)

    2. 统计/etc/passwd文件中有多少个虚拟用户

      awk "/nologin$/{i++}END{print i}" /etc/passwd

    3. 统计文件中的数值的和

      seq 10|awk "{sum=sum+$0}END{print sum}"

五、awk相关扩展

4.1 awk中的函数

print	: 打印

printf :格式化打印

%s : 字符串

%d :数字

- :左对齐

+ :右对齐

15(任意数字) : 至少占用15字符

eg:

[root@localhost ~]# awk -F: "BEGIN{OFS=" | "}{printf "|%-15s|%-15s|

", $NF,$1}" /etc/passwd

4.2 awk中的流程控制(只存在循环之中)

if: 

if(){}

if(){}else{}

if(){}else if(){}else{}

eg:

[root@localhost ~]# awk -F: "{if($3>$4){print "大于"}else{print "小于或等于"}}" /etc/passwd

for:

for(i="初始值";条件判断;游标){}

eg:

[root@localhost ~]# awk -F: "{for(i=10;i>0;i--){print $0}}" /etc/passwd

while:

while(条件判断){}

eg:

[root@localhost ~]# awk -F: "{i=1; while(i<10){print $0, i++}}" /etc/passwd

4.3 awk数组详述

  • 数组知识学习准备

    统计计算方法说明:

    i=i+1 :

    先计算右边,将右边数值给左边变量

    i=0 i=0+1 i=1+1 (统计次数)

    eg:

    awk "/^$/{i=i+1;print i}" /etc/services

    awk "/^$/{i++;print i}" /etc/services

    i=i+$0 : 表示对每行的数字进行累加求和运算

    i=0 i=0+$0 i=$0(上一行)+$0(当前行) (求和运算)

    eg:

    seq 10|awk "{sum=sum+$n;print $n,sum}"

  • 数组概念知识说明

    数组形式说明:

    hotel[110]="张三" :

    hotel 数组名称

    [110] 数组元素

    "张三" 元素内容

    数组实际应用:

    awk "BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}"

    ...

以上是 Linux三剑客命令—awk 的全部内容, 来源链接: utcz.com/z/520127.html

回到顶部