咱們以前學習過grep,sed,這兩個工具的做用以下:
grep和egrep:文本過濾的
sed:流編輯器,實現編輯的正則表達式
今天咱們要討論的awk,是一個主要作文本輸出的。shell
AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操做語言的最大功能取決於一我的所擁有的知識。awk命名:Alfred Aho Peter 、Weinberger和brian kernighan三我的的姓的縮寫。編程
簡單來講awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各類分析處理數組
快速掌握awk的技巧:只要記住awk是以行爲單位讀入和輸出的。編輯器
參數 | 含義 |
---|---|
-F | 指定字段一個或多個分割符 例如:-F’[:#/]’ 定義三個分隔符 |
-v | 定義或修改一個awk內部的變量 |
NR | 行號 |
FS | 字段的分隔符,默認爲空格,跟-F選擇同樣 |
OFS | 輸出的字段分隔符,默認爲空格(即把空格替換成指定的字符串) |
RS | 輸入記錄的分割,以分割符分割以後,使之成爲新的行(即讀入行的時候遇到指定分隔符,就把分割替換成\n)。 |
ORS | 輸出的記錄分隔符,默認爲新行。(即讀入行的時候遇到\n以後把\n用指定的分隔符代替,而後讀入一行,併合併爲同一行) |
$NF | 表示最後一列 |
$0 | 顯示當前一整行 |
$N | N爲數字(N>0),表示第幾列。例如:$1表示用-F指定分隔符分隔後的第一列, 2... 2... 2...N以此類推 |
{} | 命令代碼塊,包含一條或多條命令 |
; | 多條命令使用分號分隔 |
~ | 匹配字段,與==相比不是精確比較 |
!~ | 不匹配,不精確比較 |
== | 等於,必須所有相等,精確比較 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
!= | 不等於,精確比較 |
&& | 邏輯與 |
|| | 邏輯或 |
+ | 匹配1個或1個以上 |
// | 正則匹配符 |
輸出、打印 |
選項 | 描述 |
---|---|
-f progfile --file=progfile | 從腳本文件中讀取awk命令 |
-F fs --field-separator=fs | 指定字段一個或多個分割符 例如:-F’[:#/]’ 定義三個分隔符 |
-v var=val --assign var=val | 定義或修改一個awk內部的變量 |
-b --characters-as-bytes | 將全部輸入數據視爲單字節字符。posix選項或覆蓋這個選項 |
-c --traditional | 在兼容模式下運行。在兼容模式下,gawk的行爲與UNIX awk相同;沒有一個能夠識別特定於gn的擴展 |
-C --copyright | 在標準輸出和退出中成功打印GNU版權信息消息的簡短版本 |
-d[file]–dump-variables[=file] | 將全局變量的排序列表、它們的類型和最終值打印到文件中。若是沒有提供文件,gawk使用一個名爲awkvars的文件 |
-e ‘program-text’–source=‘program-text’ | 使用程序文本做爲AWK程序源代碼。這個選項容許輕鬆地將庫函數(經過-f和-file選項使用)與在命令行中輸入的源代碼混合使用。它主要用於shell腳本中使用的中型到大型AWK程序 |
-E file --exec=file | 與-f相似,這是最後一個處理的選項。這應該與#一塊兒使用!腳本,特別是爲CGI應用程序,以免從URL向命令行傳遞選項或源代碼(!)。這個選項禁止命令行變量賦值 |
-g --gen-pot | 掃描和解析AWK程序,並在標準輸出上生成GNU .pot(可移植對象模板)格式文件,其中包含程序中全部可本地化字符串的條目。程序自己沒有執行。 |
-h --help | 簡短的打印幫助 |
-L [fatal] --lint[=fatal] | 提供關於可疑或不可移植到其餘AWK實現的構造的警告 |
-n --non-decimal-data | 識別輸入數據中的八進制和十六進制值 |
-N --use-lc-numeric | 使用句點做爲小數點 |
-O --optimize | 在程序的內部表示上啓用優化。目前,這包括簡單的常數合併 |
-p[file] --profile[=file] | 將分析數據發送到PROFIX文件。默認值是DouthPo.OUT |
-P --posix | 啓動兼容模式;將有以下限制: <1>沒法識別\x <2>當FS被設置爲單個空間時,只有空格和Tab充當字段分隔符,換行符不被設置爲分隔符 <3>以後行不能有?和: <4>關鍵字函數的同義詞FUNC不被識別 <5>運算符和=不能代替和= |
-r --re-interval | 容許在正則表達式匹配中使用區間表達式 |
-R --command file | 只有DGAWK。從文件讀取存儲的調試器命令 |
-S --sandbox | 在沙盒模式下運行GOWK,禁用Stand()函數,用GETLIN輸入重定向,輸出Read打印和打印的方向,並加載動態擴展。命令執行(經過管道)也被禁用。這有效地阻止了腳本訪問本地資源(除了 命令行中指定的文件) |
-t --lint-old | 提供對UNIX AWK原始版本不可移植的結構的警告 |
-V --version | 打印AWK的版本信息 |
變量 | 描述 |
---|---|
$N | N爲數字(N>0),表示第幾列。例如:$1表示用-F指定分隔符分隔後的第一列, 2... 2... 2...N以此類推 |
$0 | 顯示當前一整行(有多少行顯示多少行) |
$NF | 表示最後一列 $(NF-1)是倒數第二列 |
ARGC | 命令行參數的數目 |
ARGIND | 命令行中當前文件的位置(從0開始算) |
ARGV | 包含命令行參數的數組 |
CONVFMT | 數字轉換格式(默認值爲%.6g) |
ENVIRON | 環境變量關聯數組 |
ERRNO | 最後一個系統錯誤的描述 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
FILENAME | 當前文件名 |
NR | 行號(當前記錄數) |
FNR | 同NR,但相對於當前文件 |
FS | 字段的分隔符,默認爲空格,跟-F選擇同樣 |
OFS | 輸出的字段分隔符,默認爲空格(即把空格替換成指定的字符串) |
IGNORECASE | 若是爲真,則進行忽略大小寫的匹配 |
NF | 當前記錄中的字段數 |
OFMT | 數字的輸出格式(默認值是%.6g) |
RLENGTH | 由match函數所匹配的字符串的長度 |
RS | 輸入記錄的分割,以分割符分割以後,使之成爲新的行(即讀入行的時候遇到指定分隔符,就把分割替換成\n(默認是\n)) |
ORS | 輸出的記錄分隔符,默認爲新行。(即讀入行的時候遇到\n以後把\n用指定的分隔符代替,而後讀入一行,併合併爲同一行)(默認值是一個換行符) |
RSTART | 由match函數所匹配的字符串的第一個位置 |
SUBSEP | 數組下標分隔符(默認值是\034) |
運算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 賦值 |
條件表達式?值1:值2 | 三目運算符 |
|| | 邏輯或 |
&& | 邏輯與 |
~ ~! | 匹配正則表達式和不匹配正則表達式 |
< <= > >= != == | 關係運算符 |
空格 | 鏈接符 |
+ - | 加,減 |
* / % | 乘,除與求餘 |
+ - ! | 一元加,減和邏輯非 |
^ *** | 冪運算符 |
++ – | 增長或減小,做爲前綴或後綴 |
$ | 字段引用 |
in | 數組成員 |
函數名稱 | 描述 |
---|---|
gsub(r,s) | 在整個$0中用s代替r |
gsub(r,s,t) | 在整個t中用s替代r |
index(s,t) | 返回s中字符串t的第一位置 |
length(s) | 返回s長度 |
match(s,r) | 測試s是否包含匹配r的字符串 |
split(s,a,fs) | 在fs上將s分紅序列a |
sprint(fmt,exp) | 返回經fmt格式化後的exp |
sub(r,s) | 用$0中最左邊最長的子串代替s |
substr(s,p) | 返回字符串s中從p開始的後綴部分 |
substr(s,p,n) | 返回字符串s中從p開始長度爲n的後綴部分 |