awk 是除了 sed 命令之外,Linux 系統中另一個功能比較強大的資料處理工具,下面良許小編就將從幾個方面對于 Linux awk命令詳解命令進行詳述,希望對大家有所幫助,

和 sed 命令類似,awk 命令也是逐行掃描檔案(從第一行到最后一行),尋找含有目標文本的行,如果匹配成功,則會在該行上執行用戶想要的操作;否則不對行做任何處理,
awk 在讀取檔案內容的每一行時,將對比該行是否與給定的模式相匹配,如果匹配,則執行處理程序,否則對該行不做任何處理,如果沒有指定處理腳本,則把匹配的行顯示到標準輸出,即默認處理動作是 print 列印行;如果沒有指定模式匹配,則默認匹配所有的資料,
awk 有兩個特殊的模式:BEGIN 和 END,它們被放置在沒有讀取任何資料之前以及在所有的資料讀取完成以后執行,在讀取檔案內容前,BEGIN 后面的指令將被執行,然后讀取檔案內容并判斷是否與特定的模式匹配,如果匹配,則執行正常模式后面的動作指令,最后執行 END 模式命令,并輸出檔案處理后的結果,
awk 的作業流程圖如圖 1 所示,

awk 命令基本語法格式如下:
[root@liangxu ~]# awk [選項] '腳本命令' 檔案名
awk 命令常用選項及其功能如表 2 所示,
| 選 項 | 功 能 |
|---|---|
| -F fs | 指定以 fs 作為輸入行的分隔符,awk 命令默認分隔符為空格或制表符 |
| -f file | 從腳本檔案中讀取 awk 腳本指令,以取代在命令引數中輸入處理腳本 |
| -v var=val | 在執行處理程序之前,設定一個變數 var,并給其設備初始值為val |
| -W compat | 使用兼容模式運行 awk, GUN 擴展選項將被忽略 |
| -W copyleft | 輸出簡短的 GUN 著作權資訊 |
| -W dump-variables[=file] | 列印全域變數(變數名、型別、值)到檔案中,如果沒有提供檔案名,則自動輸出到名 為 dump-variables 的檔案中 |
awk 的腳本命令主要由 2 部分組成,分別為匹配規則和執行命令,
awk 的匹配規則,和 sed 命令中的 address 部分作用相同,用來指定腳本命令可以作用到文本內容中的具體行,可以使用字串或者正則運算式指定,另外,整個腳本命令是使用的單引號(' '),而其中的執行命令部分需要使用花括號“{}”括起來,
注意,在 awk 程式執行時,如果沒有指定執行命令,則默認會把匹配的行輸出;如果不指定匹配規則,則默認匹配文本中所有的行,
awk 的主要特性之一是其處理文本檔案中資料的能力,它會自動給每行中的每個資料元素分配一個變數,
awk 的內置變數及功能如表 3 所示,
| 變 量 | 功 能 |
|---|---|
| $0 | 當前記錄 |
| $1~$n | 當前記錄的第 n 個欄位 |
| ARGC | 命令列引數個數 |
| FILENAME | 當前輸入檔案的名稱 |
| FNR | 當前輸入檔案的當前記錄編號,尤其是當有多個輸入檔案時有用 |
| NR | 輸入流的當前記錄編號 |
| NF | 當前記錄的欄位個數 |
| FS | 欄位分隔符 |
| OFS | 輸入欄位分隔符,默認為空格 |
| ORS | 輸入記錄分隔符,默認為換行符 \n |
| RS | 輸入記錄分隔符,默認為換行符 \n |
【例 1】輸出當前檔案的當前行編號,
創建 1 個樣本檔案,命名為 text,在樣本檔案中寫入如下內容:
http://www.lxlinux.net/
1234
在終端頁面中輸入如下命令:
[root@liangxu ~]# awk '{print FNR}' text
1
2
3
運算式由變數、常量、函式、正則運算式和運算子組成,awk 中變數有字符變數和數字變數,如果在 awk 中定義的變數沒有初始化,則初始值為空字符或 0,當字符操作時必須加引號,運算子及含義如表 3 所示,
| 運算子 | 含義 |
|---|---|
| + | 加 |
| - | 減 |
| * | 乘 |
| / | 除 |
| % | 求余 |
| ^ | 冪運算 |
| ++ | 自加1 |
| -- | 自減1 |
| += | 相加后賦值給變數 |
| = | 相減后賦值給變數 |
| 氺= | 相乘后賦值給變數 |
| /= | 相除后賦值給變數 |
| > | 大于 |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
| = | 等于 |
| != | 不等于 |
| ? | 匹配正則運算式 |
| !? | 不匹配正則運算式 |
| && | 與 |
| II | 或 |
例如 awk 賦值運算子,a+5 等價于 a=a+5,如下所示:
[root@liangxu ~]# awk 'BEGIN{a=2; a+=2;print a}'
4
除此之外,awk 還支持 if 條件判斷、while 和 for 回圈陳述句等,
- if 條件判斷陳述句,if 陳述句基本格式有兩種:
if(運算式)
動作1
else
動作2
或者
if(運算式) 動作1;else 動作2
如果運算式的判斷結果為真,則執行動作 1,否則執行動作 2,
例如,判斷 boot 磁區可用容量小于 20MB 時報警,否則顯示 OK,如下所示:
[root@liangxu ~]# df | grep "boot" | awk '{if ($4<20000) print "Alert"; else print "OK"}'
OK
- while 回圈陳述句,while 回圈陳述句基本格式有兩種:
while(條件)
動作
或者
do
動作
while(條件)
while 回圈陳述句如下所示:
[root@liangxu ~]# awk 'i=1 {} BEGIN { while(i<=10) {++i; print i}}'
1
2
3
4
......
10
11
- for回圈陳述句,for 回圈陳述句基本格式如下:
for(變數;條件;計數器)
動作
for 回圈陳述句如下所示:
[root@liangxu ~]# awk 'BEGIN { for(i=1; i<=10; i++) print i}'
1
2
3
......
9
10
? 以上就是良許教程網為各位朋友分享的Linux awk命令詳解,
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/253358.html
標籤:其他
上一篇:Linux diff命令詳解
