• linux下的文本处理工具awk学习


    一.原理

    awk 是⼀种编程语⾔,⽤于在 linux/unix 下对⽂本和数据进⾏处理。
    awk 数据可以来⾃标准输⼊、⼀个或多个⽂件,或其它命令的输出。
    awk 通常是配合脚本进⾏使⽤ , 是⼀个强⼤的⽂本处理⼯具。
    awk 的处理⽂本和数据的⽅式如下 :
    1. 进⾏逐⾏扫描⽂件 , 从第⼀⾏到最后⼀⾏
    2. 寻找匹配的特定模式的⾏ , 在⾏上进⾏操作
    3. 如果没有指定处理动作 , 则把匹配的⾏显示到标准输出
    4. 如果没有指定模式,则所有被操作的⾏都被处理
    具体实现逻辑:
    1.awk 使⽤⼀⾏作为输⼊,并将这⼀⾏赋给内部变量 $0 每⼀⾏也可称为⼀个记录,以换⾏
    符结束
    2.awk 进⾏字段分解,每个字段存储在已编号的变量中,从 $1 开始
    3.awk 默认情况下的分隔符是空格 , 是由内部变量 FS 来确定字段分隔符。初始 FS 为空格
    4.awk 打印字段 , 将以设置的⽅法使⽤ print 函数打印
    5.awk 在打印的字段间加上空格,因为 $1,$3 之间有⼀个逗号。逗号它映射为另⼀个内部变
    量,称为输出字段分隔符 OFS 默认为空格
    6.awk 输出之后,将从⽂件中获取另⼀⾏,并将其存储在 $0 中,覆盖原来的内容,然后将
    新的字符串分隔成字段并进⾏处理。该过程将持续到所有⾏处理完毕。
    awk的语法格式
    1. Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
    2. Usage: awk [POSIX or GNU style options] [--] 'program' file ...
    3. POSIX options: GNU long options: (standard)
    4. -f progfile --file=progfile
    5. -F fs --field-separator=fs
    6. -v var=val --assign=var=val
    7. Short options: GNU long options: (extensions)
    8. -b --characters-as-bytes
    9. -c --traditional
    10. -C --copyright
    11. -d[file] --dump-variables[=file]
    12. -e 'program-text' --source='program-text'
    13. -E file --exec=file
    14. -g --gen-pot
    15. -h --help
    16. -L [fatal] --lint[=fatal]
    17. -n --non-decimal-data
    18. -N --use-lc-numeric
    19. -O --optimize
    20. -p[file] --profile[=file]
    21. -P --posix
    22. -r --re-interval
    23. -S --sandbox
    24. -t --lint-old
    25. -V --version
    26. To report bugs, see node `Bugs' in `gawk.info', which is
    27. section `Reporting Problems and Bugs' in the printed version.
    28. gawk is a pattern scanning and processing language.
    29. By default it reads standard input and writes standard output.
    30. Examples:
    31. gawk '{ sum += $1 }; END { print sum }' file
    32. gawk -F: '{ print $1 }' /etc/passwd
    command
      BEGIN { }                     {}                   END{}
      ⾏处理前                 ⾏处理            ⾏处理后
    awk   'BEGIN  { print 1/2}  { print "ok" }  END  { print "Game Over" }'   /etc/h
    osts
    示例
    1. [root@TDCS dsrw]# awk 'BEGIN {print 1/2} {print "ok"} END {print "Game Over"}' /etc/hosts
    2. 0.5
    3. ok
    4. ok
    5. Game Over
    awk 命令格式
    1. [root@TDCS dsrw]# awk /root/ /etc/passwd #匹配/root关键字的行,/awk 'pattern' filename匹配⽂件
    2. root:x:0:0:root:/root:/bin/bash
    3. operator:x:11:0:operator:/root:/sbin/nologin
    4. [root@TDCS dsrw]# awk -F: '{print $1}' /etc/passwd #awk '{action}' filename对⽂件⾏进⾏动作处理
    5. root
    6. bin
    7. daemon
    8. adm
    9. lp
    10. sync
    11. shutdown
    12. halt
    13. mail
    14. operator
    15. games
    16. ftp
    17. nobody
    18. avahi-autoipd
    19. systemd-bus-proxy
    20. systemd-network
    21. dbus
    22. polkitd
    23. tss
    24. postfix
    25. sshd
    26. mysql
    27. ntp
    28. //awk 'pattern {action}'filename匹配+处理动作
    29. awk -F':' '/root/ {print $1,$3}' /etc/passwd #匹配/root关键字,并打印$1,$3
    30. root 0
    31. operator 11
    32. awk 'BEGIN{FS=":"} /root/ {print $1,$3}' /etc/passwd #匹配/root关键字,并打印$1,$3
    33. //command |awk 'pattern {action}' //判断⼤于多少则输出什么内容
    34. [root@TDCS dsrw]# df |awk '/\/$/ {if($3>50000) print $4}'
    35. 43213140
    二.Awk 内部变量
    $0   保存当前记录的内容
    示例
    1. [root@TDCS dsrw]# awk '{print $0}' /etc/passwd
    2. root:x:0:0:root:/root:/bin/bash
    3. bin:x:1:1:bin:/bin:/sbin/nologin
    4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    5. adm:x:3:4:adm:/var/adm:/sbin/nologin
    6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    7. sync:x:5:0:sync:/sbin:/bin/sync
    8. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    9. halt:x:7:0:halt:/sbin:/sbin/halt
    10. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11. operator:x:11:0:operator:/root:/sbin/nologin
    12. games:x:12:100:games:/usr/games:/sbin/nologin
    13. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14. nobody:x:99:99:Nobody:/:/sbin/nologin
    15. avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
    16. systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
    17. systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
    18. dbus:x:81:81:System message bus:/:/sbin/nologin
    19. polkitd:x:997:995:User for polkitd:/:/sbin/nologin
    20. tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    21. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    22. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    23. mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
    24. ntp:x:38:38::/etc/ntp:/sbin/nologin
    NR 控制输⼊的总⾏数
    示例
    1. [root@TDCS dsrw]# awk '{print NR,$0}' /etc/passwd
    2. 1 root:x:0:0:root:/root:/bin/bash
    3. 2 bin:x:1:1:bin:/bin:/sbin/nologin
    4. 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    5. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    6. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    7. 6 sync:x:5:0:sync:/sbin:/bin/sync
    8. 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    9. 8 halt:x:7:0:halt:/sbin:/sbin/halt
    10. 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11. 10 operator:x:11:0:operator:/root:/sbin/nologin
    12. 11 games:x:12:100:games:/usr/games:/sbin/nologin
    13. 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14. 13 nobody:x:99:99:Nobody:/:/sbin/nologin
    15. 14 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
    16. 15 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
    17. 16 systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
    18. 17 dbus:x:81:81:System message bus:/:/sbin/nologin
    19. 18 polkitd:x:997:995:User for polkitd:/:/sbin/nologin
    20. 19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    21. 20 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    22. 21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    23. 22 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
    24. 23 ntp:x:38:38::/etc/ntp:/sbin/nologin
    25. [root@TDCS dsrw]# awk 'NR<=3' /etc/passwd
    26. root:x:0:0:root:/root:/bin/bash
    27. bin:x:1:1:bin:/bin:/sbin/nologin
    28. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    FNR 记录输⼊⽂件的编号
    示例
    1. [root@TDCS dsrw]# awk '{print FNR,$0}'/etc/passwd /etc/hosts
    2. 1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 TDCS
    3. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 TDCS
    4. 2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    5. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    NF 保存⾏的最后⼀列内容
    示例
    1. [root@TDCS dsrw]# awk -F":" '{print $1,$NF}' /etc/passwd
    2. root /bin/bash
    3. bin /sbin/nologin
    4. daemon /sbin/nologin
    5. adm /sbin/nologin
    6. lp /sbin/nologin
    7. sync /bin/sync
    8. shutdown /sbin/shutdown
    9. halt /sbin/halt
    10. mail /sbin/nologin
    11. operator /sbin/nologin
    12. games /sbin/nologin
    13. ftp /sbin/nologin
    14. nobody /sbin/nologin
    15. avahi-autoipd /sbin/nologin
    16. systemd-bus-proxy /sbin/nologin
    17. systemd-network /sbin/nologin
    18. dbus /sbin/nologin
    19. polkitd /sbin/nologin
    20. tss /sbin/nologin
    21. postfix /sbin/nologin
    22. sshd /sbin/nologin
    23. mysql /bin/false
    24. ntp /sbin/nologin
    FS 指定字段分割符 , 默认空格
    示例
    1. [root@TDCS dsrw]# awk -F: '/root/ {print $1,$3}' /etc/passwd
    2. root 0
    3. operator 11
    4. [root@TDCS dsrw]# awk 'BEGIN {FS=":"} {print $1,$3}' /etc/passwd
    5. root 0
    6. bin 1
    7. daemon 2
    8. adm 3
    9. lp 4
    10. sync 5
    11. shutdown 6
    12. halt 7
    13. mail 8
    14. operator 11
    15. games 12
    16. ftp 14
    17. nobody 99
    18. avahi-autoipd 170
    19. systemd-bus-proxy 999
    20. systemd-network 998
    21. dbus 81
    22. polkitd 997
    23. tss 59
    24. postfix 89
    25. sshd 74
    26. mysql 27
    27. ntp 38
    28. [root@TDCS dsrw]# awk -F '[:\t]' '{print $1,$2,$3}' /etc/passwd
    29. root x 0
    30. bin x 1
    31. daemon x 2
    32. adm x 3
    33. lp x 4
    34. sync x 5
    35. shutdown x 6
    36. halt x 7
    37. mail x 8
    38. operator x 11
    39. games x 12
    40. ftp x 14
    41. nobody x 99
    42. avahi-autoipd x 170
    43. systemd-bus-proxy x 999
    44. systemd-network x 998
    45. dbus x 81
    46. polkitd x 997
    47. tss x 59
    48. postfix x 89
    49. sshd x 74
    50. mysql x 27
    51. ntp x 38
    OFS 输出字段分隔符,初始为空格
    示例
    1. [root@TDCS dsrw]# awk -F: '/root/{print $1,$2,$3,$4}' /etc/passwd
    2. root x 0 0
    3. operator x 11 0
    4. [root@TDCS dsrw]# awk 'BEGIN {FS=":";OFS="+++"} /root/{print $1,$2,$3,$4}' /etc/passwd
    5. root+++x+++0+++0
    6. operator+++x+++11+++0
    RS 输⼊记录分隔符,默认为换⾏符
    1. [root@TDCS dsrw]# awk -F: 'BEGIN {RS=""}{print $0}' /etc/hosts
    2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 TDCS
    3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    ORS 将⽂件每⼀⾏合并为⼀⾏ , 以空格为分割
    1. [root@TDCS dsrw]# awk -F: 'BEGIN {ORS=""}{print $0}' /etc/hosts
    2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 TDCS::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    3. //通常情况下让输出分隔符为换⾏符, 然后依次打印响应的字段
    4. awk -F":" 'BEGIN{OFS="\n"}{print $1,$2,$3,$4,$5,$6,$7}' /etc/passwd
    5. //将RS记录值标记为冒号分割, 打印后相当于将每⾏的内容进⾏切割
    6. awk 'BEGIN {RS=":"} {print $0}' /etc/passwd
    print 格式化输出函数
    1. date|awk '{print $2,"5⽉份""\n",$NF,"今年"}'
    2. awk -F:'{print "⽤户是:" $1 "\t ⽤户uid:" $3"\t ⽤户gid:" $4}' /etc/passwd
    printf 函数
    %s 字符类型
    % d 数值类型
    15 字符
    - 表示左对⻬,默认是右对⻬
    printf 默认不会在⾏尾⾃动换⾏,加 \ n
    1. [root@TDCS dsrw]# awk -F: '{printf"%-15s%-10s%-15s\n",$1,$2,$3}' /etc/passwd
    2. root x 0
    3. bin x 1
    4. daemon x 2
    5. adm x 3
    6. lp x 4
    7. sync x 5
    8. shutdown x 6
    9. halt x 7
    10. mail x 8
    11. operator x 11
    12. games x 12
    13. ftp x 14
    14. nobody x 99
    15. avahi-autoipd x 170
    16. systemd-bus-proxyx 999
    17. systemd-networkx 998
    18. dbus x 81
    19. polkitd x 997
    20. tss x 59
    21. postfix x 89
    22. sshd x 74
    23. mysql x 27
    24. ntp x 38

  • 相关阅读:
    前端工程化知识系列(5)
    哈希(Hash)
    mysql【黑马程序员】
    【java】java线程实现
    突破亚马逊智能检测,全自动化运营的新利器:亚马逊鲲鹏系统
    一文浅析机器学习、优化理论、统计分析、数据挖掘、神经网络、人工智能、模式识别之间的关系
    WRF学习笔记之四:撰写WPS intermediate file添加海冰场/NCL学习/WRF进阶:如何向WRF添加额外气象场?
    找不到mfc140u.dll无法继续执行此代码的5个修复方法分享
    Java摆烂基础学习二~运算符
    【Spring】之 SpringAOP 理论与实践
  • 原文地址:https://blog.csdn.net/rendongxingzhe/article/details/126016424