• awk常用用法


    一. 基本使用方法:

    awk '{pattern + action}' filenames  #其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令

    通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本

    花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

    pattern是要表示的正则表达式,可以用斜杠括起来。

    例1:

    [root@Gin scripts]# awk '{print "hiya"}' /etc/passwd
    hiya
    hiya
    hiya
    hiya

    你将会见到/etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。

    例子2

    ps -ef | grep tomcat | awk '/java/' | awk '{print $2}'

    这里的awk  '/java/' 会取出所有包含java字段的所有行,然后输出为空格为分隔符的第2个字段

    二.实战案例

    还以eth0的输出信息为例,取出10.0.0.7的地址段

    方法如下

    方法一
    ifconfig
    etho | grep "inet addr" | awk -F "[ :]+" '{print $4}’

    方法二
      ifconfig eth0 | awk -F "[ :]+" 'NR==2 {print $4}'

    说明

    1. 使用了awk多分隔符[ :],表示以空格,或者:为分隔符,这里的【】其实是正则表达式的基本用法 

    2. 符号“+”表示至少有一个空格或者冒号来做分隔符,所以“inet ”前面的11个空格可以看做是1个分隔符,所取的10.0.0.7属于第4列

    3. awk的默认分隔符为空格

    4. {print $4}是取第4列并输出到屏幕,$NF表示最后一列,$0表示整行,NR表示第几行。

    三. 文本中各字段在awk中的含义

     例子1,取出test.txt文档中第20-30行,文本内容是1-100,每行一个整数

    [root@Gin scripts]# awk '{if(NR>=20 && NR<=30) print $1}' test.txt   
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    例子2,若test.txt文本内容为  "I am Poe,my qq is 33794712",请从该文件中过滤出'Poe'字符串与33794712,最后输出的结果为:Poe 33794712

    [root@Gin scripts]# awk -F '[ ,]+' '{print $3" "$7}' test.txt
    Poe 33794712

    四. BEGIN和END模块

    通常,对于每个输入行, awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。

    因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
    awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息

     

    例1. 统计/etc/passwd的账户人数

    [root@Gin scripts]# awk '{count++;print $0;} END{print "user count is ",count}' passwd
    root:x:0:0:root:/root:/bin/bash
    ..............................................
    user count is  27

    count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

    [root@Gin scripts]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd
    [start] user count is  0
    root:x:0:0:root:/root:/bin/bash
    ...................................................................
    [end] user count is  27

    例2:统计某个文件夹下的文件占用的字节数

    [root@Gin scripts]# ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
    [end]size is  1489

    如果以M为单位显示:

    [root@Gin scripts]# ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'   
    [end]size is  0.00142002 M
  • 相关阅读:
    嵌入式网络设备一次盲点补报的开发经验(二)
    嵌入式网络设备一次盲点补报的开发经验(一)
    调试lcd时候给linux单板移植tslib
    java 常用的解析工具
    快速上手 Echarts
    alibaba/fastjson 之 JSONPath
    CentOS 7.5 安装Docker 教程
    Java问题-java进程占用内存过高,排查原因
    zabbix问题-cannot create IPC key for path
    rsync服务-部署配置与维护
  • 原文地址:https://www.cnblogs.com/regit/p/8487078.html
Copyright © 2020-2023  润新知