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