1. 程式人生 > 實用技巧 >awk基本用法

awk基本用法

awk基本用法

awk 更適合格式化 文字內容,對文字進行復雜的處理

awk 語法

awk [options 可選引數] pattern(模式) {action(動作)} file(檔案)

awk常用引數

引數 解釋
-F 指定分割欄位符
-V 定義或修改一個awk內部的變數
-f 從指令碼檔案中讀取awk命令

awk常用內建變數

內建變數 解釋
$n 指定分隔符後,當前記錄的第n個欄位(列)
$0 完整的輸入記錄
FS 輸入欄位分割符,預設是空格
OFS 輸出欄位分隔符,預設是空格
RS 輸入記錄分隔符(輸入換行符),指定輸入時的換行符
ORS 輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符
NF(Number of fields:欄位數) 分割後,當前行一共有多少個欄位
NR(Number of records:記錄數) 當前記錄數,行數
FNR 各檔案分別計數的行號
FILENAME 當前檔名
ARGC ARGC:命令列引數的個數
ARGV ARGV:陣列,儲存的命令列所給定的各引數

自定義輸出內容:awk,必須外層單引號,內層雙引號。內建變數$1,$2都不得新增雙引號,否則會識別為文字。

顯示檔案第五行

awk  "NR==5" pwd.txt

顯示檔案2到5行

awk  "NR==2,NR==5"  pwd.txt

顯示3到5行並顯示行號

awk 'NR==3,NR==5{print NR,$0}'   pwd.txt 

顯示第一行 倒數第二行最後一行

awk -F ":" '{print NR,$1,$(NF-1),$NF}'   pwd.txt

取出IP地址資訊

ifconfig ens33|awk 'NR==2{print $2}'

awk分隔符

  • 輸入分隔符 awk預設是空格,空白字元,英文field separate(欄位分隔符) ,變數名是FS

  • 輸出分隔符 output field separate(輸出欄位分開) ,簡稱OFS。

FS輸入分隔符:awk逐行處理文字的時候,以輸入分隔符為準,把文字切成多個片段,預設符號是空格,當我們處理特殊檔案,沒有空格的時候,可以自由指定分割符特點。如下

awk -F ":"    模式   動作      檔案
awk -V FS=":"  模式   動作    檔案

OFS輸出分隔符:awk執行完命令,預設用空格隔開一列,這個空格就是awk的預設輸出符,如下

awk -F ":" -V OFS="-----"   模式   動作   檔案

awk變數

內建變數 NR NF FNR

  • awk 的內建變數NR NF 是不用新增$符號
  • 而 $1,$2 是需要新增符號的。

輸出每行行號以及欄位總個數

awk  '{print NR,$0}'  pwd.txt 

輸出每行行號以及指定的列

 awk  '{print NR,$1,$5}' pwd.txt 

處理多個檔案顯示行號

# 普通的NR變數,會將多個檔案按照順序排序
 awk '{print NR,$0}' pwd.txt if.txt 
# 使用FNR變數,可以分別對檔案行數計數
awk '{print FNR,$0}' pwd.txt if.txt 

RS 變數作用是 輸入分隔符,預設是回車符,也就是回車換行符,我們可以自定義 空格 作為 行分隔符,每遇見一個空格,就換行處理

awk   -v RS=" " '{print FNR,$0}' pwd.txt 

ORS內建變數作用是輸出分隔符的意思,awk預設認為,每一行結束了,就得添加回車換行符,ORS變數可以更改輸出符

awk -v ORS="@@@" '{print NR,$0}'  pwd.txt 

內建變數FILENAME

顯示正在處理的檔名
awk -F ":" '{print FILENAME,NR,$0}'  pwd.txt

awk格式化輸出

printf 和print的區別
format(格式)的使用
1.其與print的最大不同是,printf需要指定format
format用於指定後面的每個item(專案)的輸出格式
printf語句不會自動列印換行符:\n
format格式的指示符都是以%開頭,後跟一個字元如下
%c :顯示字元的ASCII碼
%d,%i :十進位制整數
%e,%E :科學計數法顯示數值
%f :顯示浮點數
%g,%G :以科學計數法的格式或浮點數的格式顯示數值
%s :顯示字串
%u :無符號整數
%% :顯示自身
printf修飾符
-:左對齊,預設右對齊
+:顯示數值符號

格式化輸出
awk -F ":" 'BEGIN{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n","使用者名稱","使用者ID","使用者家目錄","使用者直譯器"}{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n",$1,$3,$6,$7}' pwd.txt

awk的模式

  • BEGIN 就是處理文字前,先執行BEGIN模式指定的動作

  • awk 'BEGIN{print "我是三劍客"}{print $0}' pwd.txt
    
  • END 就是處理完所有文字之後,需要執行的動作

 awk '{print $0} END{print "三劍客學完啦"}' pwd.txt 
關係運算符 解釋 示例
< 小於 x<y
<= 小於等於 x<=y
== 等於 x=y
!= 不等於 x!=y
>= 大於等於 x>=y
> 大於 x>y
~ 匹配正則 x~/正則/
!~ 不匹配正則 x!~/正則/

awk使用正則語法

找出檔案中有games的行

awk '/^games/{print $0}' pwd.txt 

取出IP地址

ifconfig ens33|awk 'NR==2{print $2}' 

找出pwd.txt 中禁止登陸的使用者

awk '/\/sbin\/nologin/{print NR,$0}' pwd.txt