shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
shell编程系列14--文本处理三剑客之awk的概述及常用方法总结 awk是一个文本处理工具,通常用于处理数据并生成结果报告 awk的命名是它的创始人 Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首个字母组成的 awk的工作模式 语法格式 第一种形式: awk 'BEGIN{}pattern{commands}END{}' file_name BEGIN在匹配之前就执行的操作,pattern{commands}是对每一行的操作,END是匹配完后的操作 第二种形式: standard output | awk 'BEGIN{}pattern{commands}END{}' 语法格式说明 语法格式 说明 BEGIN{} 正式处理数据之前执行 pattern 匹配模式 {commands} 处理命令,可能多行 END{} 处理完所有匹配数据后执行 awk的内置变量 内置变量对照表(上) 内置变量 含义 $0 整行内容 $1-$n 当前行的第1-n个字段 NF 当前行的字段个数,也就是多少列 NR 当前的行号,从1开始计数 FNR 多文件处理时,每个文件行号单独计数,都是从0开始 FS 输入字段分隔符。不指定默认以空格或tab键分割 RS 输入行分隔符。默认回车换行 OFS 输出字段分隔符。默认为空格 ORS 输出行分隔符。默认为回车换行 内置变量对照表(下) 内置变量 含义 FILENAME 当前输入的文件名字 ARGC 命令行参数个数 ARGV 命令行参数数组 总结: 内置变量: $0 打印行所有信息 $1~$n 打印行的第1到n个字段信息 NF Number Field 处理行的字段个数 NR Number Row 处理行的行号 FNR File Number Row 多文件处理时,每个文件单独记录行号 FS Field Separator 字段分隔符,不指定时默认以空格或tab键分割 RS Row Separator 行分隔符,不指定时以回车换行分割 OFS Output Filed Separator 输出字段分隔符 ORS Output Row Separator 输出行分隔符 FILENAME 处理文件的文件名 ARGC 命令行参数个数 ARGV 命令行参数数组 # 输出整行数据 [root@localhost shell]# awk '{print $0}' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ajie:x:1000:1000:ajie:/home/ajie:/bin/bash chrony:x:998:996::/var/lib/chrony:/sbin/nologin deploy:x:1001:1001::/home/deploy:/bin/bash nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin # FS指定分隔符 [root@localhost shell]# awk 'BEGIN{FS=":"}{print $1}' passwd root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix ajie chrony deploy nginx # 默认以空格或者tab为分隔符 [root@localhost shell]# cat list Hadoop Spark Flume Java Python Scala Allen Mike Meggie [root@localhost shell]# awk '{print $1}' list Hadoop Java Allen [root@localhost shell]# awk 'BEGIN{FS=" "}{print $1}' list Hadoop Java Allen # NF 输出每一行的字段个数 [root@localhost shell]# cat list Hadoop Spark Flume Java Python Scala Golang Allen Mike Meggie [root@localhost shell]# awk '{print NF}' list 3 4 3 # NR 行号,处理多个文件(list,passwd,/etc/fstab)时行号累加 [root@localhost shell]# awk '{print NR}' list passwd /etc/fstab 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # FNR在处理两个文件以上时会单独计数 [root@localhost shell]# awk '{print FNR}' list passwd /etc/fstab 1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1 2 3 4 5 6 7 8 9 10 11 12 [root@localhost shell]# cat list Hadoop|Spark:Flume Java|Python:Scala:Golang Allen|Mike:Meggie # 以 | 符号分隔列 [root@localhost shell]# awk 'BEGIN{FS="|"}{print $2}' list Spark:Flume Python:Scala:Golang Mike:Meggie # 以 : 符号分隔列 [root@localhost shell]# awk 'BEGIN{FS=":"}{print $2}' list Flume Scala Meggie # RS 指定行分隔符: -- [root@localhost shell]# cat list Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie [root@localhost shell]# awk 'BEGIN{RS="--"}{print $0}' list Hadoop|Spark|Flume Java|Python|Scala|Golang Allen|Mike|Meggie [root@localhost shell]# awk 'BEGIN{RS="--";FS="|"}{print $3}' list Flume Scala Meggie # ORS输出分隔符,以&连接各输出行 [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list Flume&Scala&Meggie # 字段默认分隔符是空格 [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $1,$3}' list Hadoop Flume&Java Scala&Allen Meggie & # OFS 指定字段分隔符为 : [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list Hadoop:Flume&Java:Scala&Allen:Meggie & # FILENAME 文件名 [root@localhost shell]# awk '{print FILENAME}' list list # 输出3次文件名list,是因为没有输入匹配模式 awk默认是行处理,文本有3行,处理三次会有3次输出 [root@localhost shell]# cat list Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie Test File Line [root@localhost shell]# awk '{print FILENAME}' list list list list # ARGC命令行参数个数 [root@localhost shell]# awk '{print ARGC}' list 2 2 2 [root@localhost shell]# awk '{print ARGC}' list /etc/fstab 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 # NF表示字段个数,NF=7 $NF 就是$7 表示最后一个字段 [root@localhost shell]# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/bash /sbin/nologin /bin/bash /sbin/nologin