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