awk
呼叫:第一種方式:命令列方式
awk [-f field-separator] 'commands' input-file(s)
[-f域分隔符]是可選的,因為awk使用空格作為預設的域分隔符,因此如果要瀏覽域間有空格的文字,不必指定這個選項,如果要瀏覽諸如passwd檔案,此檔案各域以冒號作為分隔符,則必須指明-f選項,如:
awk
-f:'commands'
input-file
第二種方式是將所有awk命令插入乙個檔案,並使awk程式可執行,然後用awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來呼叫它。
第三種方式是將所有的awk命令插入乙個單獨檔案,然後呼叫:
awk -f awk-scrīpt-file input-files(s)
-f選項指明在檔案awk_scrīpt_file中的awk指令碼,input_file(s)是使用awk進行瀏覽的檔名。
任何awk語句都由模式和動作組成。在乙個awk指令碼中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。處理即對資料進行的操作。如果省略模式 部分,動作將時刻保持執行狀態。模式可以是任何條件語句或復合語句或正規表示式。模式包括兩個特殊字段 begin和end。使用begin語句設定計數和列印頭。begin語句使用在任何
文字瀏覽動作之前
,之後文字瀏覽動作依據輸入文字開始執行。end語 句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌。
使用$1,$3表示參照第1和第3域,注意這裡用逗號做域分隔。如果希望列印乙個有5個域的記錄的所有域,可使用
$0,意即所有域
。為列印乙個域或所有域,
使用print命令
。這是乙個awk動作
模式和動作
模式:兩個特殊斷 begin和end
動作:實際動作大多在{}內指明
輸出1.抽取域
awk -f: '' /etc/passwd
2.儲存輸出
awk -f: '' /etc/passwd | tee user 使用tee命令,在輸出檔案的同時,輸出到螢幕
使用標準輸出
awk -f: '' /etc/passwd >user3
4.列印所有記錄
awk -f: '' /etc/passwd
5.列印單獨記錄
awk -f: '' /etc/passwd
6.列印
報告頭awk -f: '
begin
' /etc/passwd
7.列印
結尾awk -f: '
end' /etc/passwd
條件操作符
1.匹配
awk -f: '' /etc/passwd //表示如果field1包含root,列印它
2.精確匹配
使用等號 ==
awk -f: '' /etc/passwd
3.不匹配
!~awk -f: '' /etc/passwd
!=精確不匹配
awk -f: '' /etc/passwd
4.小於
<
5.小於等於
<=
6.大於
>
.........
7.設定大小寫
awk '/[rr]oot/' /etc/passwd
8.任意字元
awk -f: '' /etc/passwd //^...t表示第四個字幕是t
9.或關係匹配
awk -f: '' /etc/passwd
10.行首
awk '/^root/' /etc/passwd // ^root(行首包含root)
11.and &&
awk -f: '' /etc/passwd
12.or ||
內建變數:
arcc 命令列引數個數
argv 命令列引數排列
environ 支援佇列中系統環境變數的使用
fnr 瀏覽檔案的記錄數
fs 置頂分隔符,等價於-f
nf 瀏覽記錄的域的個數
nr 已讀的記錄數
ofs 輸出域分隔符
ors 輸出記錄分隔符
rs 控制記錄分隔符
列印有多少行記錄
awk 'end ' /etc/passwd
設定輸入域到變數名
awk -f: '' /etc/passwd
域值比較操作
awk '' input-file
修改文字域只顯示修改改記錄
awk -f: '}' /etc/passwd
檔案長度相加
ls -l|awk '/^[^d]/ end '
內建的字元竄函式
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
sub(s, ) 用$0中最左邊也是最長的字串替代
subtr(s,p) 返回字串s中從p開始的字尾部分
substr(s,p,n) 返回字串s中從p開始長度為n的字尾部分
1.gsub
awk 'gsub(/^root/,"netseek") ' /etc/passwd 將與root開頭的root替換為netseek
awk 'gsub(/0/,2) ' /etc/fstab
awk '' /etc/fstab
2.index
awk 'begin ' 查詢字串root中o出現的第一位置
awk -f: '$1=="root" ' /etc/passwd
awk -f: '' /etc/passwd
3.length
awk -f: ' /etc/passwd
awk -f: '$1=="root" ' /etc/passwd
4.match (在ancd中查詢c的位置)
awk 'begin '
5.split
返回字串陣列元素個數
awk 'begin '
6.sub 只能替換指定域的第乙個0
awk 'sub(/0/,2) ' /etc/fstab
7.substr
按照起始位置及長度返回字串的一部分
awk 'begin ' //第5個字元開始,取9個字元。
awk 'begin ' //第5個位置開始,取後面的所有.
字串遮蔽序列
\b 退格鍵
\f 走紙換頁
\n 新行
\r 回車
\t tab
\c 任意其他特殊字元
\ddd 八進位制
很簡單的例子
awk -f: '' /etc/passwd 輸出函式printf(注意是printf不是print,兩者效果不同的)
printf函式擁有幾種不同的格式化輸出功能
printf修飾符
- 左對齊
width 域的步長0表示0步長
.prec 最大字串長度,或小數點右邊的位數
awk printf格式
%c ascii字元
%d 整數
%e 浮點數,科學計數法
%f 浮點數
%g awk決定使用哪種浮點數轉換,e或者f
%o 八進位制數
%s 字串
%x 十六進製制數
1.字串轉換
echo "65" | awk ''
awk 'begin '
awk 'begin '
2.格式化輸出
awk -f: '' /etc/passwd
awk -f: 'begin ' /etc/passwd
3.向一行awk命令傳值
who | awk '' user=$logname
4.awk指令碼檔案 (在檔案名字後面加字尾.awk方便區分)
#!/bin/awk -f
begin
end
awk用法小結
awk 用法 awk pattern 變數名 含義 argc 命令列變元個數 argv 命令列變元陣列 filename 當前輸入檔名 fnr 當前檔案中的記錄號 fs 輸入域分隔符,預設為乙個空格 rs 輸入記錄分隔符 nf 當前記錄裡域個數 nr 到目前為止記錄數 ofs 輸出域分隔符 ors ...
awk 用法小結
awk 用法 awk pattern 變數名 含義 argc 命令列變元個數 argv 命令列變元陣列 filename 當前輸入檔名 fnr 當前檔案中的記錄號 fs 輸入域分隔符,預設為乙個空格 rs 輸入記錄分隔符 nf 當前記錄裡域個數 nr 到目前為止記錄數 ofs 輸出域分隔符 ors ...
awk用法小結
變數名 含義 argc 命令列變元個數 argv 命令列變元陣列 filename 當前輸入檔名 fnr 當前檔案中的記錄號 fs 輸入域分隔符,預設為乙個空格 rs 輸入記錄分隔符 nf 當前記錄裡域個數 nr 到目前為止記錄數 ofs 輸出域分隔符 ors 輸出記錄分隔符 1 awk 101 f...