awk
基本功能是在檔案或字串中基於指定規則遊覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。
呼叫awk
當前有三種方式呼叫awk,第一種方式為命令列方式
# commands是真正的awk命令,[-f域分隔符]是可選的,因為awk是使用空格作為預設的域分隔符,因此如果要遊覽域間有空格的文字,不必指定這個選項,但如果要遊覽注入passwd檔案,此檔案各域以冒號作為分割符,則必須指明-f選項
awk [-f field-separator] 'commands' input-file(s)
#以冒號作為分隔符
awk -f:'commands' input-file
第二種方式是將所有awk命令插入乙個檔案,並使用awk程式可執行,然後用awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來呼叫它;第三種是將所有的awk命令插入乙個單獨檔案,然後呼叫:
awk -f awk-script-file input-file(s)
awk指令碼
awk指令碼由各種操作和模式組成,如果設定了-f選項則awk每次讀一條記錄或一行,並使用指定的分隔符分割指定域,但如果未設定-f選項,awk假定空格為域分隔符,並保持這個設定直到發現一新行,當新行出現時,awk命令獲悉已讀完整條記錄,然後在下乙個記錄啟動讀命令,這個讀程序將持續到檔案尾或檔案不再存在。
模式和動作
任何awk語句都由模式和動作組成,在乙個awk指令碼中可能有許多語句,模式部分決定動作語句何時觸發及觸發事件,處理即對資料進行的操作,如果省略模式部分,動作將時刻保持執行狀態。模式可以是任何條件語句或符合語句或正規表示式,模式包括兩個特殊欄位begin和end,使用begin語句設定計數和列印頭,begin語句使用在任何文字遊覽動作之前,之後文字遊覽動作依據輸入檔案開始執行,end語句用來在awk完成文字遊覽動作後列印輸出文字總數和結尾狀態標誌,如果不特別指明模式,awk總是匹配或列印行數,實際動作在大括號內指明,動作大多數用來列印,但是還有些更長的**諸如if和迴圈(looping)語句及迴圈退出結構,如果不指明採取動作,awk將列印出所有遊覽出來的記錄。
域和記錄
awk執行時,其遊覽域標記為$1,$2….$n,這種方法稱為域標識,使用這些域標識將更容易對域進行進一步處理,使用\$1,\$3表示參照第1和第3域,這裡用都要做域分隔,如果希望列印乙個有5個域的記錄的所有域,不必指明\$1,\$2,\$3,\$4,\$5,可使用\$0,意即所有域,awk遊覽時達到一新行,即假定到達包含域的記錄末尾,然後執行新記錄下一行的讀動作,並重新設定域分隔,為列印乙個域或所有域,使用print命令,這是乙個awk動作(動作語法用圓括號括起來)
條件操作符(結合上述用例)
內建變數
awk有許多內建變數用來設定環境資訊,這些變數可以被改變
變數名含義
argc
命令列傳入awk指令碼的引數個數
argv
是argc的引數排列陣列,其中每一元素表示為argv[n],n為期望訪問的命令列引數
environ
支援佇列中系統環境變數的使用,要訪問單獨變數,使用實際變數名,如environ[「editor」]=」vi」
filename
awk遊覽的檔名,支援awk指令碼實際操作的輸入檔案,因為awk可以同時處理許多檔案,因此如果訪問了這個變數,將告值系統目前正在遊覽的實際檔案
fnr遊覽檔案的記錄數,其變數值小於等於nr,如果指令碼正在訪問許多檔案,每一新輸入檔案都將重新設定此變數
fs設定輸入域分隔符,等價於命令列-f選項,預設情況下為空格,如果用逗號來作分隔符,設定fs=」,」
nf遊覽記錄的域個數,在記錄被讀之後再設定
nr已讀的記錄數
ofs輸出域分隔符,預設為空格,如果想設定為#,寫入ofs=「#」
ors輸出記錄分隔符,預設為新行(\n)
rs控制記錄分隔符,預設為新行(\n)
#awk操作符
設定輸入域到域變數名:一般的變數名設定方式為name=$n,這裡name為呼叫的域變數名,n為實際域號
域值比較:在begin中給變數名賦值;在關係操作中使用實際數值
修改數值域取值:在awk中修改任何域時,實際輸入檔案是不可修改的,修改的只是儲存在快取裡的awk複本,awk會在變數nr或nf變數中反映出修改痕跡
修改文字域:給物件賦乙個新的字串
只顯示修改記錄:在模式後面使用花括號將只列印修改部分
建立新的輸出域:要通過其他域賦予新域識別符號
增加列值:使用符號+=
檔案長度相加:要排除子目錄,awk首先提出首字元為d的記錄,然後將檔案an長度列相加
內建的字串函式
字串含義
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的字尾部分
printf修飾符
採用awk寫的指令碼,建議字尾名以.awk形式給出
例1:
例2:
Linux基礎指令 6
檔案許可權 list l 檔名 檢視檔案屬性 檢視桌面檔案aka 檔案屬性 rw r r 1 root root 0 apr 8 04 01 aka 從左至右分為8個部分 檔案型別 普通檔案 d 錄c 字元裝置 s 接字p 管道b 快裝置l 連線 rw r r 檔案讀寫許可權 三個字元一組,共三組,...
linux常用指令
一 查詢狀態類 1 pwd pwd print work directory 顯示當前工作目錄的絕對路徑 2 ls ls list 顯示當前目錄的檔案 二 目錄類 1 cd cd change directory 切換目錄 波浪符號,代表使用者家目錄 cd 返回上乙個目錄 cd 回到自己的家目錄 c...
Linux常用指令
ctrl alt t 開啟終端 sudo su 在終端裡從普通使用者轉換成 root 使用者。su 普通使用者名稱 在終端裡從 root 使用者轉成普通使用者。clear 清除螢幕 mkdir 資料夾名 新建資料夾 rmdir 資料夾名 刪除資料夾 rm f filename 強制刪除乙個檔案 rm...