zoukankan      html  css  js  c++  java
  • Linux awk使用方法~~整理

    目录


    1. awk行处理方式
    2. awk命令格式
      1. 命令行格式
      2. 脚本格式
    3. 命令行格式——基本格式
    4. awk内置变量
    5. awk内置函数
    6. 测试数据
    7. awk变量和函数使用实例
    8. 逻辑判断式
    9. 扩展格式
    10. BEGIN 和 END

     

    awk行处理方式

      awk和sed一样,一次处理一行内容;也可以对每行进行切片处理

    awk命令格式

      命令行格式

    $  awk [options] 'command' files
    

      

      脚本格式

    $ awk -f scirpt_file files
    

      

    基本格式

    $ awk [options] 'command' files
    

      command 由两部分组成,分别是

      1、pattern,可以是正则表达式或者逻辑判断式

      2、{ awk 命令 }    花括号括起来的是代码段

    awk内置变量

    变量 含义
    $0 当前记录(整行的记录)
    $1~$n 当前记录的第几列
    FILENAME 输入的文件名称
    FS 输入文件的字段分隔符(Fields Separator)
    RS 输入文件的记录(每一行之间)的分隔符(Record Separator)
    NF 当前行的字段数目(Number of Fields)
    NR 当前记录所在的行号
    OFS 输出字段的分隔符
    ORS 输出记录的分隔符

    awk函数

    函数声明 含义
    length(str) 返回str中字符的个数
    int(num) 返回num的整数部分
    index(str1, str2) 返回str2在str1中的索引,如果不存在就返回0
    split(str, arr, separator) 使用separator作为分隔符,将str切分为数组保存到arr中,返回数组的元素个数
    printf(fmt, args) 根据fmt格式化args,并输出结果
    sprintf(fmt, args) 根据fmp格式化args,并返回格式化后的字符串
    substr(str, pos, len) 返回str中从pos开始,长度为len个字符的子字符串
    tolower(str) 返回str转换为小写字母后的副本
    toupper(str) 返回str转换为大写字母后的副本

     

    测试数据

    -> # cat data.txt
    小红    female     一年级   BeiJing      90     Yes
    小花    female     一年级   ShangHai     55
    小明    male       三年级   BeiJing      90
    小可    female     一年级   ChongQing    70
    小林    male       一年级   ChongQing    90     Yes
    小飞    male       二年级   GuangDong    65
    小波    male       一年级   HangZhou     90     No
    小康    male       四年级   ShenZhen     65     No
    小雷    male       一年级   FuJian       70
    小冰    female     五年级   BeiJing      90
    

      

    测试awk变量和函数

      打印每一行的行号、字段数、以及每一行的内容

    -> # awk '{print "row:" NR "	" "fields:" NF "	" $0}' data.txt
    row:1   fields:6        小红    female     一年级   BeiJing      90     Yes
    row:2   fields:5        小花    female     一年级   ShangHai     55
    row:3   fields:5        小明    male       三年级   BeiJing      90
    row:4   fields:5        小可    female     一年级   ChongQing    70
    row:5   fields:6        小林    male       一年级   ChongQing    90     Yes
    row:6   fields:5        小飞    male       二年级   GuangDong    65
    row:7   fields:6        小波    male       一年级   HangZhou     90     No
    row:8   fields:6        小康    male       四年级   ShenZhen     65     No
    row:9   fields:5        小雷    male       一年级   FuJian       70
    row:10  fields:5        小冰    female     五年级   BeiJing      90
    

      

      打印所有的人名、城市

    -> # awk '{print $1 "	" $4}' data.txt
    小红    BeiJing
    小花    ShangHai
    小明    BeiJing
    小可    ChongQing
    小林    ChongQing
    小飞    GuangDong
    小波    HangZhou
    小康    ShenZhen
    小雷    FuJian
    小冰    BeiJing
    

      

      使用printf来格式化打印用户信息

    -> # awk -F ':' '{printf("Line:%s   Fields:%s   User:%s
    ", NR, NF, $1)}' /etc/passwd
    Line:1   Fields:7   User:root
    Line:2   Fields:7   User:bin
    Line:3   Fields:7   User:daemon
    Line:4   Fields:7   User:adm
    Line:5   Fields:7   User:lp
    Line:6   Fields:7   User:sync
    Line:7   Fields:7   User:shutdown
    

      

      打印用户id大于100的行号和用户名,其他用户不打印,输出hello

    -> # awk -F ':' '{
    > 	if ($3 > 100) {
    >     	printf("Line:%s   Fields:%s   User:%s   UID:%s
    ", NR, NF, $1, $3)
    > 	} else {
    >     	print "hello"
    > 	}
    > }' /etc/passwd
    

      

      找出服务器访问日志中,出现Error的时间

    -> # sed -n '/Error/ p' access_log | awk '{print $1}'
    -> # awk '/Error/ {print $1}' access_log
    

      

      

    逻辑判断式

      注意,逻辑判断式是在{ awk命令 }前面的

      ~,!~     是否匹配正则表达式,后面跟一个正则表达式

    -> # #查询主机中,用户名包含'g'的用户,打印出用户名和UID
    -> # awk -F ':' '$1 ~ /g/ {print "User:"$1 "	" "UID:"$3}' /etc/passwd
    User:games      UID:12
    User:libstoragemgmt     UID:998
    User:syslog     UID:996
    User:yingjie    UID:1005
    
    -> # #查询主机中,用户名不包含'g'的用户,打印出用户名和UID
    -> # awk -F ':' '$1 !~ /g/ {print "User:"$1 "	" "UID:"$3}' /etc/passwd
    

      

      ==,!= , >=,<=,<,> ,||,&&   用于判断大小、是否相等、逻辑关系

    -> # #打印分数高于70,或者低于或者等于60的记录
    -> # awk '$5 > 70 || $5 < 60 {print $0}' data.txt
    小红    female     一年级   BeiJing      90     Yes
    小花    female     一年级   ShangHai     55
    小明    male       三年级   BeiJing      90
    小林    male       一年级   ChongQing    90     Yes
    小波    male       一年级   HangZhou     90     No
    小冰    female     五年级   BeiJing      90
    

      

      

    扩展格式

    $ awk [options]  'command' file
    

      扩展格式是指,command扩展,格式如下:

      BEGIN { command1 } pattern { awk命令 } END { command2 }

      其中 BEGIN中的command1,会在读入第一行之前执行,并且只执行一次。接着循环执行中间的awk命令、

      然后END后面的command2,会在文件所有行都读完之后,并执行一次command2。

    -> # awk 'BEGIN {print "start"} /female/ {print $0} END {print "end"}' data.txt
    start
    小红    female     一年级   BeiJing      90     Yes
    小花    female     一年级   ShangHai     55
    小可    female     一年级   ChongQing    70
    小冰    female     五年级   BeiJing      90
    end
    

    BEGIN和END

      一般在BEGIN中可以做一下事情:

      1、定义分隔符

      2、定义表头  

      自定义分割符、输出时使用的分隔符

      FS (fields separator)

      OFS( output fields separator)

    -> # awk 'BEGIN{FS=" ";OFS="-"}{print $2,$1}' data.txt
    female-小红
    female-小花
    male-小明
    female-小可
    male-小林
    male-小飞
    male-小波
    male-小康
    male-小雷
    female-小冰
    

        

      定义表头

    -> #  awk '
    > BEGIN {print "Name" "	"  "Gender" "	" "Grade" "	" "Addr" "	" "Score" "	" "VIP"}
    > NF == 6 {print $0}
    > END {print "----------end-----------"}' data.txt
    Name    Gender  Grade   Addr    Score   VIP
    小红    female  一年级   BeiJing    90     Yes
    小林    male    一年级   ChongQing  90     Yes
    小波    male    一年级   HangZhou   90     No
    小康    male    四年级   ShenZhen   65     No
    ----------end-----------
    

      

      

      统计当前文件夹下,文件总大小

    [root@VM_0_8_centos test]# ls -l
    total 8
    -rw-r--r-- 1 root root  367 Sep 16 11:51 data.txt
    -rw-r--r-- 1 root root 1803 Aug 17 00:14 test.cpp
    [root@VM_0_8_centos test]# ls -l | awk 'BEGIN {size=0} {size+=$5} END {print "Size is " size}'
    Size is 2170
    

      

      统计文件中非空行的行数

    [root@VM_0_8_centos test]# cat demo.txt
    11111
    
    22222
    
    33333
    44444
    [root@VM_0_8_centos test]# awk 'BEGIN {count=0} $0 !~ /^$/ {count += 1} END {print "Not empty line count " count}' demo.txt
    Not empty line count 4
    

      

      统计女生的数量

    -> # awk '
    > BEGIN {count = 0}
    > { 
    >	if ($2 == "female") {
    >       name[count++] = $1
    >   } 
    > }
    > END {
    >   print "tot " count
    >   for (i = 0; i < count; i++) {
    >     print name[i]
    >   }
    > }' data.txt 
    tot 4
    小红
    小花
    小可
    小冰
    

      

  • 相关阅读:
    SpringBoot-整合Shiro和JWT时关于JWT部分的内容
    springboot常用注解分类整理
    ubuntu18.04 安装tomcat9
    Ubuntu 18.04 安装Tomcat9 遇到的问题Tomcat9 Error: Could not find or load main class org.apache.catalina.startup.Bootstrap
    Ubuntu 18.04 上安装水下网络仿真器Aqua-Sim NG
    用gorm向mysql插入的时间数据和实际时间不一致问题
    Ubuntu18.04上安装NS-3
    Java集合用法
    Spring Boot 自动装配原理
    深入理解select、poll和epoll及区别
  • 原文地址:https://www.cnblogs.com/-beyond/p/9254007.html
Copyright © 2011-2022 走看看