每日一條linux 命令 : awk

0x01 What

一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直接保存在內建的變量中,$1,$2,$3....,引用指定的變量,可以顯示指定段,或者多個段。如果需要顯示全部的,需要使用$0來引用??梢詫蝹€片段進行判斷,也可以對所有段進行循環(huán)判斷。
其默認分隔符為空格

0x02 How

1、命令格式

awk [options] 'program' FILE......

[options]說明

  • -F: 指明輸入時用到的字段分隔符
  • -v var=VALUE : 自定義變量
    在awk中變量的引用不需要加$,而是直接引用

2、使用方法

主要有兩種模式
1、awk [options] 'scripts' file1,file2.....
在這種模式中,scripts主要是命令的堆砌,命令之間用分號分割;對輸入的文本行進行處理,通過命令print,printf或是輸出重定向的方式顯示出來,這里經常用到的知識點是:awk的內置變量,以及命令print和printf的使用

2、awk [options] 'PATTERN{action}' file,file2.....
在這種模式中,最重要的是5種模式和5種action的使用,以及awk的數(shù)組的使用和內置函數(shù)

3 第一種使用模式

1、print

  • 各項目之間使用逗號隔開,而輸出時則以空白字符分隔
  • 輸出的Item可以為字符串或數(shù)值,當前記錄的字段(如$1)、變量或awk的表達式,數(shù)值會先轉換為字符串,而后再輸出
  • print命令后面的Item可以省略,此時其功能相當于print $0,因此,如果想輸出空白行,則需要使用print""
  • 如果引用變量$1或其他的,是不能使用引號引起來

2、內置變量

  • FS : input field seperator,輸入的分隔符,默認為空白字符
  • OFS: output field seperator,輸出的分隔符,默認為空白字符
  • RS : input record seperator,輸入的換行符
  • ORS: output record seperator,輸出時的換行符
  • NF : number of field ,字段個數(shù)

awk '{print NF}' /etc/fstab :打印每行的最后一個字段為第幾個字段,這里是數(shù)量引用,不是對應的值引用
awk '{print $NF}' /etc/fstab : 打印每行中的最后一個字段

  • NR : number of record,文件中的行數(shù)

awk '{print NR}' /etc/fstab: 打印行號,其會個行號都顯示
awk 'END{print NR}' /etc/fstab: 顯示文本的總行數(shù),其只是在文本處理完成后,只顯示一次行號
awk '{print NR}' file1 file2 : 會每把所有文檔進行總的編號,而不是單獨對文件進行編號

  • FNR : 對每個文件進行行數(shù)單獨編號

awk '{print FNR}' file1 file2 : 會對每個文件的行數(shù)進行單獨的編號顯示

  • FILENAME : awk命令所處理的文件的名稱

awk '{print FILENAME}' file1 : 顯示當前文件名,但會每行顯示一次
awk 'END{print FILENAME}' file1 : 顯示當前文件名,但只會顯示一次

  • ARGC : 命令行中參數(shù)的個數(shù),其awk命令也算一個參數(shù)

awk 'END{print ARGC}' /etc/fstab : 顯示共有幾個參數(shù)

  • ARGV : 其是一個數(shù)組,保存的是命令行所給定的各參數(shù)

awk 'END{print ARGV[0]}' /etc/fstab : 顯示第一個參數(shù),默認第一個參數(shù)個awk命令本身

3、自定義變量

  • -v var=VALUE : 在options定義
  • awk 'BEGIN{test="hello";print test}': 在program中定義

4、printf命令

其格式化輸出:printf FORMAT,item1,item2....
例子:awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt

格式符

  • %c: 顯示字符的ASCII碼
  • %d,%i : 顯示十進制整數(shù)
  • %e,%E: 科學計數(shù)法數(shù)值顯示
  • %f : 顯示為浮點數(shù)
  • %g,%G:以科學數(shù)法或浮點形式顯示數(shù)值
  • %s: 顯示字符串
  • %u: 無符號整數(shù)
  • %%:顯示%號自身,相當于轉義

修飾符

  • N : 顯示寬度
  • - : 左對齊(默認為右對齊)
  • + : 顯示數(shù)值符號

輸出重定向

4第二種使用模式

awk [option] 'PATTERN{action}' file1,file2....

1、PATTERN的使用

  • (1)REGEXP:正則表達式,格式為/regular expression/,僅處理能夠被此處模式匹配到的行
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
  • (2)relational expression:表達式,其值非0或為非空字符時滿足條件,用運算符
    ~(匹配)和!~(不匹配)
 awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
  • (3)Ranges : 指定匹配范圍,格式為/pat1/,/pat2/
awk -F: '{NR>=2&&<=10){print $1}' /etc/passwd
awk -F:' /^ root/,/^myuser/{print $1}' /etc/passwd
  • (4)BEGIN/END模式 : 特殊模式,僅在awk命令執(zhí)行前運行一次或結束前運行一次
awk -F: 'BEGIN{print "Username    ID    Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd :先打印一個表頭
  
awk -F: 'BEGIN{print "username   ID     Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "end of report."} /etc/passwd :打印一個表尾
  • (5)Empty(空模式):匹配任意輸入行
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • '#Gun awk的相關用法 awk的工作原理 一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直...
    魏鎮(zhèn)坪閱讀 39,966評論 2 37
  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飛閱讀 1,116評論 0 2
  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,919評論 0 16
  • 嗯,回家! 在昨晚到了動車站,看到父親站在那兒一個勁兒往里望,生怕沒看到人群擁擠的那個我,我走過安檢...
    二十二秋初閱讀 315評論 0 0
  • 之前只是輕飄飄的略知一二張學良與于鳳至趙一荻的愛情故事,直到去年的某一天我關注的訂閱號窗口顯眼的出現(xiàn)了關于他們故...
    原諒牡丹閱讀 497評論 0 2

友情鏈接更多精彩內容