• ### awk


    awk.

    #@author:       gr
    #@date:         2014-07-02
    #@email:        forgerui@gmail.com
    

    1. 基本使用

    1.1. 基本模式

    awk '{pattern + action}' {filenames}
    

    1.2. 常用命令

    #-F指定分隔符
    cat /etc/passwd |awk  -F ':'  '{print $1}'  
    cat /etc/passwd |awk  -F ':'  '{print $1"	"$7}'
    # BGEIN,END使用
    cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
    #查找有“root”关键字的行
    awk -F: '/root/' /etc/passwd
    awk -F: '/^root/' /etc/passwd #支持正则表达式
    #对搜索行进行处理
    awk -F: '/root/{print $7}' /etc/passwd
    

    1.3 内置变量

    NF:

    表示一行域个数,当然, $NF就表示最后一个域的值。

    echo "hello world you are not alone" | awk '{print NF}'    #结果为6
    echo "hello world you are not alone" | awk '{print $NF}'   #结果为alone
    

    NR:

    表示已经读取的记录数:

    [gr@centos ~]$ cat test
    12
    3
    hello world
    [gr@centos ~]$ awk '{print NR}' test  #每读一行会显示一次
    1
    2
    3
    

    可以用来最后做统计信息用:

    [gr@centos ~]$ awk 'END{print NR}' test   #这个值可以用来统计其它信息,如每行平均单词数,也可以用来做遍历的临界值
    3
    [gr@centos ~]$ awk 'END{for (i = 0; i < NR; i++) print i}' #使用NR值做为判断条件
    

    FILENAME:

    当前处理文件名:

    [gr@centos ~]$ awk 'END{print FILENAME}' test.txt
    test.txt
    [gr@centos ~]$ 
    

    2. 调用awk

    有三种方式调用awk。

    2.1. 命令行方式

    awk [-F  field-separator]  'commands'  input-file(s)
    

    其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
    在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

    2.2. shell脚本方式

    将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
    相当于shell脚本首行的:#!/bin/sh
    可以换成:#!/bin/awk

    2.3. 将awk命令放到文件中,然后调用:

    awk -f awk-script-file input-file(s)
    

    其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

    3. awk编程

    3.1. 统计账户人数

    awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
    

    初始化变量:

    awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
    

    3.2. 统计某个文件夹下的文件占用的字节数

    ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
    

    以M为单位:

    ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
    

    3.3. 条件语句

    借鉴C的方式:

    if (expression) {
        statement;
        statement;
        ... ...
    }
    
    if (expression) {
        statement;
    } else {
        statement2;
    }
    
    if (expression) {
        statement1;
    } else if (expression1) {
        statement2;
    } else {
        statement3;
    }
    

    3.4. 数组

    awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
    

    统计命令使用:

    history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n20
    

    统计文章单词个数:

    awk '{for (i = 1; i <= NF; i++) a[$i]++} END{for (i in a) print i " " a[i]}' words.txt | sort -nr -k 2
  • 相关阅读:
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (三)
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (二)
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (一)
    Android使用NFC模拟M卡实现 (二)
    scala中eq,==和equals的区别
    scala @BeanProperty 自动添加getter 和setter
    Scala 可变参数
    Flink 侧输出流 DEMO
    Flink 写数据到MySql (JDBC Sink)
    Fink 写数据到kafka (kafka sink)
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4753095.html
Copyright © 2020-2023  润新知