awk應用小結

2021-06-14 16:14:45 字數 4199 閱讀 1209

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...