awk 概述及常用方法總結


awk 簡介

awk是一個文本處理工具,通常用於處理數據並生成結果報告,

awk的命名是它的創始人 Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首個字母組成的。

awk的工作模式

 

語法格式

 

第一種形式: 基於文件

awk 'BEGIN{}pattern{commands}END{}' file_name

  

第二種形式: 基於標准命令格式

standard output | awk 'BEGIN{}pattern{commands}END{}'

 

語法格式說明

 

 

awk的內置變量

內置變量對照表

 

    內置變量:
        $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                    命令行參數數組

  

輸出整行數據

awk '{print $0}' passwd 

 

FS指定分隔符為 : 輸出所有行第一個字段

awk 'BEGIN{FS=":"}{print $1}' passwd

 

默認以空格或者tab為分隔符

list

Hadoop Spark Flume
Java Python Scala
Allen Mike Meggie

  

以空格為分隔符, 輸出第一個字段

awk 'BEGIN{FS=" "}{print $1}' list

 

 NF 輸出每一行的字段個數

awk '{print NF}' list

 

NR 輸出行號,處理多個文件(list,passwd,/etc/fstab) 時行號累加

awk '{print NR}' list passwd /etc/fstab

  

 

FNR在處理兩個文件以上時會單獨計數

awk '{print FNR}' list /etc/fstab

  

 

list

Hadoop|Spark:Flume
Java|Python:Scala:Golang
Allen|Mike:Meggie

 

  |  符號分隔列, 輸出第二個字段  

 

以 : 符號分隔列

awk 'BEGIN{FS=":"}{print $2}' list

 

 

list

Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie

  

RS 指定行分隔符: --

awk 'BEGIN{RS="--"}{print $0}' list

 

awk 'BEGIN{RS="--";FS="|"}{print $3}' list 

 

ORS輸出分隔符,以&連接各輸出行

awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list

 

字段默認分隔符是空格

awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $1,$3}' list

 

OFS 指定字段分隔符為 :

awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list

 

FILENAME 文件名

awk '{print FILENAME}' list

 

list

Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
Test File
Line

 

輸出3次文件名list,是因為沒有輸入匹配模式 awk默認是行處理,文本有3行,處理三次會有3次輸出

awk '{print FILENAME}' list

  

 

ARGC命令行參數個數  awk 和 list 共鏈各個參數

awk '{print ARGC}' list

 

awk '{print ARGC}' list /etc/fstab  這樣的話就是 3 個參數

 

NF表示字段個數,NF=7 $NF表示字段的個數一般來顯示最后一個字段

awk 'BEGIN{FS=":"}{print $NF}' passwd 

  

 

awk 格式化輸出 printf 

printf的格式說明符

 

 

 

 

格式化案例演示

printf默認沒有分隔符

awk 'BEGIN{FS=":"}{printf $1}' passwd 

 

加入換行,格式化輸出

awk 'BEGIN{FS=":"}{printf "%s\n",$1}' passwd

  

 

使用占位符美化輸出,默認是右對齊

awk 'BEGIN{FS=":"}{printf "%20s %20s\n",$1,$7}' /etc/passwd

 

- 減號是左對齊,+ 加號是右對齊

awk 'BEGIN{FS=":"}{printf "%-20s %-20s\n",$1,$7}' /etc/passwd

 

以字符串格式打印/etc/passwd中的第7個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%s\n",$7}' passwd

 

以10進制格式打印/etc/passwd中的第3個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%d\n",$3}' passwd

 

以浮點數格式打印/etc/passwd中的第3個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%0.2f\n",$3}' passwd

 

以16進制數格式打印/etc/passwd中的第3個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%x\n",$3}' passwd

 

以8進制數格式打印/etc/passwd中的第3個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%o\n",$3}' passwd

 

以科學計數法格式打印/etc/passwd中的第3個字段,以":"作為分隔符

awk 'BEGIN{FS=":"}{printf "%e\n",$3}' passwd

 

awk模式匹配的兩種方法

awk  模式匹配格式對照表

 

正則匹配 RegExp

匹配/etc/passwd文件行中含有root字符串的所有行

awk 'BEGIN{FS=":"}/root/{print $0}' passwd

 

匹配/etc/passwd文件行中以nginx開頭的所有行

awk '/^nginx/{print $0}' passwd

 

運算符匹配

  • < 小於
  • > 大於
  • <= 小於等於
  • >= 大於等於
  • == 等於
  • != 不等於
  • ~ 匹配正則表達式
  • !~ 不匹配正則表達式

以 : 為分隔符,匹配/etc/passwd文件中第3個字段小於50的所有行信息

awk 'BEGIN{FS=":"}$3<50{print $0}' passwd

以:為分隔符,匹配/etc/passwd文件中第3個字段大於50的所有行信息

awk 'BEGIN{FS=":"}$3>50{print $0}' passwd

 

以:為分隔符,匹配/etc/passwd文件中第7個字段為/bin/bash的所有行信息

awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd

 

以:為分隔符,匹配/etc/passwd文件中第7個字段不為/bin/bash的所有行信息

awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' passwd

 

以:為分隔符,匹配/etc/passwd文件中第3個字段包含3個數字以上的所有行信息

awk 'BEGIN{FS=":"}$3 ~ /[0-9]{3,}/{print $0}' passwd

 

布爾運算符匹配

  • || 或
  • && 與
  • ! 非

以 : 為分隔符,匹配/etc/passwd文件中包含ftp或mail的所有行信息

awk 'BEGIN{FS=":"}$1=="ftp" || $1=="mail"{print $0}' passwd

 

以:為分隔符,匹配/etc/passwd文件中第3個字段小於50並且第4個字段大於50的所有行信息

awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' passwd

 

匹配包含 nginx 的行

awk 'BEGIN{FS=":"}/^nginx/{print $0}' passwd

 

關系運算符,uid 等於1的行

awk 'BEGIN{FS=":"}$3==1{print $0}' passwd 

  

匹配uid(數字)為3位及以上的行

awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd 

  

 

匹配不包含/sbin/nologin 的行

awk 'BEGIN{FS=":"}$0!~/\/sbin\/nologin/{print $0}' passwd 

 

找出 uid 小於50,且bash為 /bin/bash 的行

awk 'BEGIN{FS=":"}$3<50 && $7~/\/bin\/bash/ {print $0}' passwd 

 

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM