Linux運維 第二階段(十五)awk

2021-09-20 22:51:45 字數 4057 閱讀 1057

grep(global research expression,檔案過濾器,根據模式將匹配到的行顯示出來,#grep  [options]  pattern file,使用方法詳見

基礎》)

sed(stream editor,流編輯器,把每行讀到記憶體空間(模式空間),預設不編輯原始檔,僅對模式空間的資料作處理,處理結束將模式空間列印至螢幕,#sed  [options]  『addresscommand』  file1...)

awk(三個人名的首字母a.w.k.,gawk(gnu awk,linux上實現的awk),nawk(new awk),報告生成器,在文字檔案中抽取符合條件的資訊,並以特定格式顯示)

#awk options  『scripts』  file1 file2

#awk options  『pattern』 file1  file2(根據模式將匹配到資料的行作處理,一般的處理就是列印)

注:根據模式每次從檔案中抽取一行,對這行按指定的分隔符進行切片,若沒指定分隔符預設是按空白字元(空格)切片,指定分隔符使用-fseperater,例如文字內容:this  is  a  test,被切成四個片段,而這每個片段在awk內部能用變數來引用,這個變數類似指令碼程式設計中的位置引數變數,$1表示this,$2表示is,$0表示這行全部(可以切割的還有cut)

舉例:#awk -f:  『』 /etc/passwd($1和$2條目間用逗號分開)

#awk  『begin』 /etc/passwd

#cut -d:  -f1,3  /etc/passwd

列印:print;printf

print item1,item2,……

注意:各item間用逗號分隔,輸出時預設各條目引用的內容用空白字元分隔;

輸出的item(可以是字串,數值,當前記錄的字段$1,$2等變數,awk的表示式(若是數值會先轉為字串而後才輸出));

item若省略則是輸出全部內容,如print  $0;

若想輸出空白行,使用print  「」;

printf 「format」,item1,item2

注意:

與print最大不同,printf輸出時要指定格式;

format要用雙引號引起來,它用於指定後面item輸出時的格式,格式與格式間不用分隔符分隔;

printf不會自動列印換行符;

format的指示符都以%開頭,後跟乙個字元,有:%c(顯示字元的ascii碼),%d和%i(十進位制整數),%e和%e(科學計數法顯示數值),%f(浮點數),%g和%g(科學計數法或浮點數格式顯示數值),%s(字串),%u(無符號整數),%%(顯示%自身)

修飾符有:-(表示左對齊),+(顯示數值符號),num(表示數字,顯示寬度)

舉例:#awk -f:  『』  /etc/passwd

awk變數:

內建變數(記錄變數):

fs(field separator,讀取文字檔案時使用的字段分隔符,預設空白字元,屬輸入分隔符);

rs(record separator,輸入文字資訊時所使用的換行符,屬輸入分隔符);

ofs(output fs);

ors(output rs);

內建變數(資料變數):

nr(the total number ofinput records seen so far,所處理過的行數,若是多個檔案,則是已處理過的多個檔案的總行數,只要是處理過的統統全部記錄,是絕對計數,例如#awk  『』 /etc/passwd  /etc/shadow);

fnr(the input recordnumber in the current input file,記錄的是正處理的行是當前這一檔案中被處理的總行數的第多少行,是不同檔案各自計數,例如#awk  『』 /etc/passwd  /etc/shadow);

nf(the number of fieldsin the current input record,總字段數,例如#awk  -f:  '/root/'  /etc/passwd)

注意:nf與$nf的區別,如#awk  -f:  『』  /etc/passwd(nf是總字段數,$nf是最後乙個字段)

自定義變數:

#awk -v  test=」hello world」  『begin』(方式一)

#awk 『begin』(方式二,注意action中有多個語句要用分號分隔,awk中引用變數值時不用加$)

awk操作符:

算術操作符(+,-,*,/,%,^)

賦值操作符(=,+=,-=,*=,/=,%=,^=,++,--,**=,|)

比較操作符(

<,

<=,>,>=,==,!=,~,!~,element in array)

如:x~y(x是字串,y是模式,x能被y匹配到則為真,否則假)

x!~y(x不能被y匹配到則為真,否則假)

element in  array(資料組中有這個元素則為真,否則假)

表示式間的邏輯關係(&&,||)

條件表示式(selector?if-true-exp:if-false-exp,相當於if條件判斷)

awk的模式:

正規表示式regexp,格式為:/regular express/

表示式expression

匹配範圍ranges,用逗號分隔,如pattern1,pattern2

begin(在第一行執行前就執行)

end(在最後一行執行完才執行)

空模式(對檔案的每一行都處理)

舉例:#awk -f:  『/^r/』 /etc/passwd

#awk -f:  『$3==0,$7~」nologin」』 /etc/passwd

#awk -f:  『$3>=500』 /etc/passwd

#awk -f:  『$7~」bash$」 /etc/passwd

#awk -f:  『$7!~」bash$」 /etc/passwd

#awk -f:  『beginend』  /etc/passwd

awk的action(除列印print,printf外):

expression(賦值表示式,判斷表示式)

control statement(可使用if,for,while,case等語句,還可定義函式)

compound statement(復合語句)

awk的控制語句control statement:

if-else語法:if(condition) else (其中then-body僅乙個語句時花括號可省)

while語法:while(condition)(若statement僅乙個語句時花括號可省)

do-while語法:do while

for語法一:for (variable assignment;condition;interation process)

for語法二:for(variable  in  array) (陣列中應用)

case語法:switch(expression)

break,continue

next(提前結束本行文字的處理,接著處理下一行)

舉例:#awk -f:  『』  /etc/passwd

#awk -f:  -v  sum=0  『end』  /etc/passwd

#awk -f:  『;i++}}』 /etc/passwd(length為awk的內建函式)

#awk -f:  『』 /etc/passwd

#awk -f:  『end}』  /etc/passwd(統計當前系統各類shell的個數,print外的花括號可省)

#netstat -tan  |  awk  『/^tcp/end』(統計tcp的不同狀態,重要!!!常用)

#awk 『end』 /var/log/httpd/access_log(統計日誌中各單客戶端ip連線數)

注:awk陣列中下標是從1開始的(而bash中的陣列下標是從0開始),而且awk陣列中下標可以不是數字,可自定義任意字串,例如上面幾個例子中的shell[/bin/bash]++,shell[/sbin/nologin]++,state[listen]++,state[established]++,count[192.168.1.59]++,count[192.168.1.222]++

第二階段小結

資料結構基本概念 資料 資料即資訊的載體,是能夠輸入到計算機中並且能被計算機識別,儲存和處理的符號總稱 資料元素 資料元素是資料的基本單位,又稱之為記錄。一般,資料元素由若干基本項 字段,域,屬性 組成。資料結構 資料結構指的是資料元素及資料元素之間的相互關係,或組織資料的形式 資料之間的結構關係 ...

第二階段小結

先是pta上的作業 這題要求我們熟練的掌握類之間的繼承與多型的使用,在類與類之間傳遞資訊時不能弄混,要弄清楚單一職責原則。這一題主要考察繼承與多型,泛型容器的應用。接下來是學習通上的課後作業 第乙個是單向鍊錶 單向鍊錶由乙個個的節點組成,這些節點都帶有下乙個節點的引用,最後乙個節點指向null,這樣...

vivi的第二階段

vivi 的第二階段 vivi 的第二階段是從 main 函式開始,同一般的 c語言程式一樣,該函式在 init main.c 檔案中,總共可以分為 8個步驟。1 函式開始,通過 putstr vivi banner 列印出vivi 的版本。vivi banner 在 init version.c ...