1. 程式人生 > >linux筆記8.0

linux筆記8.0

筆記

awk
簡介:
報告生成器,格式化文本輸出,文本處理三劍客之一(只讀文件不做修改)
版本:New awk(nawk),GNU awk(gawk)
gawk:模式掃描和處理語言
行row:記錄,record
列column:字段,域,屬性,field
基本用法:
awk [options]‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file ...
awk程序通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊,共3部分組成
program通常是被單引號或雙引號中
選項:
-F:指明輸入時用到的字段分隔符
-v var=value:自定義變量

awk語言
基本格式:
awk [options] ‘program’ file…
program:pattern{action statements;..}
pattern部分決定動作語句何時觸發及觸發事件(特例BEGIN,END)
action statements對數據進行處理,放在{}內指明(print,printf)
分割符、字段和記錄:
awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱為域標識,$0為所有域
註意:和shell中變量$符含義不同
文件的每一行稱為記錄
省略action,則默認執行print $0

awk工作原理
第一步:執行BEGIN{action;… }語句塊中的語句(與文件沒關系,先於文件讀入,多用於打印表頭)
第二步:從文件或標準輸入(stdin)讀取一行,然後執行pattern{ action;… }語句塊,它逐行掃描文件,從第一行到最後一行重復這個過程,直到文件全部被讀取完畢(處理文件)
第三步:當讀至輸入流末尾時,執行END{action;…}語句塊(常用於匯總)
註意:begin和pattern可以單獨使用,但end不能單獨使用
詳解:
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中

END語句塊在awk從輸入流中讀取完所有的行之後即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊

awk變量
內置變量:
FS:輸入字段分隔符,默認為空白字符
-v FS=‘’
OFS:輸出字段分隔符,默認為空白字符
-v OFS=‘’
RS:輸入記錄分隔符,指定輸入時的換行符
-v RS=‘’
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
-v ORS=‘’
NF:字段數量
‘{print NF}’,表示打印最後一個字段,引用內置變量不用$
NR:記錄號
‘{print NR}‘ ,表示打印最後一行記錄
FNR:各文件分別計數,記錄號
‘{print FNR}‘ file1 file2 ...
FILENAME:當前文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
自定義變量:(區分字符大小寫)
方法1、-v var=value
方法2、在program中直接定義

printf命令
格式化輸出:
printf “FORMAT(形式)”, item(項目)1, item2, ...
註意:
1、必須指定FORMAT
2、不會自動換行,需要顯式給出換行控制符,\n
3、FORMAT中需要分別為後面每個item指定格式符
格式符:
與item一一對應
%c:顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e,%E:顯示科學計數法數值
%f:顯示為浮點數
%g,%G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
修飾符:(可與格式符配合使用)
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1
-: 左對齊(默認右對齊),%-
+:顯示數值的正負符號,%+

操作符
算術:
x+y, x-y, xy, x/y, x^y, x%y
-x:轉換為負數
+x:轉換為數值
字符串操作符:
沒有符號的操作符,字符串連接
賦值操作符:
=, +=, -=,
=, /=, %=, ^=
++, --
比較操作符:
==, !=, >, >=, <, <=
模式匹配符:
~:左邊是否和右邊匹配(包含即匹配)
!~:是否不匹配
邏輯操作符:
與&&,或||,非!
註意:涵義與短路與,短路或不同
條件表達式(三目表達式):
selector?if-true-expression:if-false-expression
解釋:第一段語句是否為真,真執行第二段,假執行第三段

PATTERN
根據pattern條件,過濾匹配的行,再做處理
1、如果未指定:空模式,匹配每一行
2、/regular(規則) expression(表達)/:僅處理能夠模式匹配到的行,需要用/ /括起來
3、relational expression:關系表達式,結果為“真”才會被處理
真:結果為非0值或非空字符串
假:結果為0值或空字符串
4、line ranges:行範圍
startline,endline:/pat1/,/pat2/ 不支持直接給出數字格式
5、BEGIN/END模式
BEGIN{}: 僅在開始處理文本之前執行一次
END{}:僅在文本處理完成之後執行一次

action
常用的action分類
1、Expressions:算術,比較表達式等
2、Control statements:控制語句,if,while等
3、Compound statements:組合語句,{ statements;... }
4、input statements:輸入語句
5、output statements:輸出語句,print等

小結(基本awk使用)
基本格式:
awk -F:-v var=variable ‘BEGIN{}pattern{action}END{}’ file...
常用位置變量:
FS、OFS、RS、ORS、NF($NF)、NR、FNR、FILENAME、ARGC、ARGV
支持模式匹配:
awk ‘/pattern/{action}’ file...
支持格式化輸出:
printf“%選項”$字段(定義與輸出一一對應)

進階
控制語句
{ statements;... },組合語句
if(condition) {statements;...}[else {statements;...}],if判斷
while(conditon) {statments;...},while循環
do{statements;...} while(condition),do-while循環
for(expr1;expr2;expr3) {statements;...},for循環
break
continue
delete array[index]
delete array
exit

判斷
if-else
語法:
if(condition){statement;...}[else statement]
if(condition1){statement1}else if(condition2){statement2}else{statement3}
使用場景:
對awk取得的整行或某個字段做條件判斷

switch
類似於shell中的case語句
語法:
switch(expression){case VALUE1 or /REGEXP正則表達式/:statement1;case VALUE2 or /REGEXP2/:statement2;...;default:statementN}

循環
while
語法:
while(condition){statement;...}
條件“真”,進入循環;條件“假”,退出循環
使用場景:
對一行內的多個字段逐一類似處理時使用
對數組中的各元素逐一處理時使用

do-while
語法:
do{statement;...}while(condition)
意義:
先執行,再判斷;無論真假,至少執行一次循環體

for
語法:
for(expr1;expr2;expr3) {statement;...}
常見用法:
for(variable assignment變量指定;condition條件;iteration process循環處理){statement;...}
特殊用法:能夠遍歷數組中的元素
語法:
for(var in array) {statement;...}

循環控制
break和continue
break[n]:退出整個循環(打斷)
continue[n]:退出當次循環(跳過)
支持指定循環層數[n]

next
提前結束對本行處理而直接進入下一行處理
awk的特殊語句,控制awk自身循環
例:
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ file
解釋上述語句:
file文件中以“:”做字段分隔符,跳過“第三列的值對2取模不等於0”的行,打印行的第1和第3列

性能比較
time(執行語句)
可以得出該語句的執行時間,通過對實現同一功能的不同語句的執行時間進行比較,可判斷語句的性能

數組
關聯數組:array[index-expression]
index-expression:
1、可使用任意字符串,字符串要使用雙引號括起來
2、如果某數組元素事先不存在,在引用時,awk會自動創建此元素,並將其值初始化為“空串”
若要判斷數組中是否存在某元素,要使用,index in array,進行遍歷
若要遍歷數組中的每個元素,使用for循環,for(var in array){for-body},var會遍歷array的每個索引
擴展用法:
統計元素重復次數:array[指定字段]++,for(i in array){print i,array[i]}

函數
數值處理:
rand():返回0到1之間一個隨機數
srand():隨機生成隨機數種子(awk中不能直接使用rand(),需先用srand())
例:生成十個隨機數
awk ‘BEGIN{srand();for (i=1;i<=10;i++)print int(rand()*100) }’(int()函數是對數字取整)
字符串處理:
length([s]):返回指定字符串的長度
sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並將第一個匹配的內容替換為s
gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並全部替換為s
split(s,array,[r]):以r為分隔符,切割字符串s,並將切割後的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2,...
自定義函數:
格式:
function name ( parameter(參數),parameter,... ){
statements(語句)
return expression(返回表達式)
}

awk中調用shell命令
system命令
空格是awk中的字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用""引用起來
例:
awk BEGIN‘{system("hostname")}’
awk ‘BEGIN{score=100;system("echo your score is " score)}’

awk腳本
將awk程序寫成腳本,直接調用或執行
例:
cat f1.awk
{if($3>=1000)print $1,$3}
awk -F: -f f1.awk /etc/passwd
腳本寫法:
cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
chmod +x f2.awk
f2.awk –F: /etc/passwd

向awk腳本傳遞參數
格式:
awkfile var=value var2=value2... Inputfile
註意:在BEGIN過程中不可用。直到首行輸入完成以後,變量才可用。可以通過-v 參數,讓awk在執行BEGIN之前得到變量的值。命令行中每一個指定的變量都需要一個-v參數
示例:
cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
chmod +x test.awk
test.awk -F: min=100 max=200 /etc/passwd

linux筆記8.0