zoukankan      html  css  js  c++  java
  • Shell:awk工具

    简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理, 因为切开的部分使用awk可以定义变量,运算符, 使用流程控制语句进行深度加工与分析。

    语法

    awk [options] 'pattern{action}' {filenames}
    

    pattern:表示AWK在数据中查找的内容,就是匹配模式

    action:在找到匹配内容时所执行的一系列命令

    选项参数说明

    选项参数 功能
    -F 指定输入文件拆分分隔符
    -v 赋值一个用户定义变量

    awk内置变量

    内置变量 含义
    ARGC 命令行参数个数
    ARGV 命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk浏览的文件名
    FNR 浏览文件的记录数
    FS 设置输入域分隔符,等价于命令行 -F选项
    NF 浏览记录的域的个数, 根据分隔符分割后的列数
    NR 已读的记录数, 也是行号
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS 控制记录分隔符
    $n $0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
    $NF $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

    实战

    准备一个文件

    cp /etc/passwd ./
    

    每行空格切割数据

    echo "123 456 789" | awk '{print $1"&"$2"&"$3}'
    

    image-20210709143704301

    搜索passwd文件中有roo关键字的所有行

    awk '/root/{print $0}' passwd
    

    image-20210709143945576

    搜索passwd文件有root关键字的所有行, 然后以":"拆分并打印输出第7列

    awk -F ":" '/root/{print $7}' passwd
    

    image-20210709144110740

    统计passwd: 文件名,每行的行号,每行的列数,对应的完整行内容:

    awk -F ':' '{print "文件名:" FILENAME ",行号:" NR ",列数:" NF ",内容:" $0}' passwd
    

    image-20210709144540016

    awk -F ':' '{printf("文件名:%5s,行号:%2s, 列数:%1s, 内容:%2s
    ",FILENAME,NR,NF,$O)}' passwd
    # printf(格式字符串,变量1,变量2,...)
    # 格式字符串: %ns 输出字符串,n 是数字,指代输出几个字符, n不指定自动占长度
    # 格式字符串: %ni 输出整数,n 是数字,指代输出几个数字
    # 格式字符串: %m.nf 输出浮点数,m 和 n 是数字,指代输出的整数位数和小数位数。如 %8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数;
    

    image-20210709150008411

    打印第二行

    awk -F ':' 'NR==2{printf("filename:%s,%s
    ",FILENAME,$0)}' passwd
    

    image-20210709150238008

    查找以c开头的资源

    ls -a | awk '/^c/'
    

    image-20210709150351001

    打印第一列

    awk -F ":" 'print $1' passwd
    

    image-20210709150446235

    打印最后一列

    awk -F: '{print $NF}' passwd
    

    image-20210709150528512

    获取第10到20行的第一列的信息

    awk -F: '{if(NR>=10 && NR<=20) print $1}' passwd
    

    image-20210709150631060

    多分隔符使用

    按照多个分隔符":"或者"/" 分割, 并打印分割后每个列数据

    echo "one:two/three" | awk -F '[:/]' '{print $1" "$2" "$3}'
    

    image-20210709150910799

    给数据添加开始与结束

    # BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
    echo -e  "abc
    abc" | awk 'BEGIN{print "开始..."} {print $0} END{print "结束..."}'
    

    image-20210709151104504

    使用循环拼接分割后的字符串

    "123 4567 8910 123" 使用空格分割后, 通过循环拼接在一起

     echo "123 4567  8910    123" | awk -v str="" -F '[ ]+' '{for(n=1;n<=NF;n++){ str=str$n} print str }'
    

    image-20210709151227092

    数值加1

     echo "2.1" | awk -v i=1 '{print $0+i}'
    

    image-20210709151601282

    获取ip

    ifconfig | awk '/broadcast/{print}' | awk '{print $2}'
    

    image-20210709151748696

  • 相关阅读:
    《网络》:关于计算机网络的必备常识【无序】(不定时更新)
    《网络》:设置三个密码:通过console口连接设备,进入特权模式,登录Telnet
    《网络》:交换机基本配置命令
    启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决
    java之servlet小记
    Nokia大事录
    Android之HandlerThread
    Android进程间的通信之AIDL
    Android进程间的通信之Messenger
    Loaders
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14990760.html
Copyright © 2011-2022 走看看