您好,登錄后才能下訂單哦!
這篇文章主要講解了“awk使用示例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“awk使用示例分析”吧!
awk是一個強大的文本分析工具。
awk其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 awk 的確擁有自己的語言: awk 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
-F 指定分隔符,而不以默認的空白(空格符或者制表符)
-v 指定變量
-f 指定腳本的文件名,即將腳本放入一個文件當中,避免 awk 書寫太長,影響視覺,和重復編寫
BEGIN 關鍵字會執行一次指定的腳本段
END 關鍵字定義的腳本段,在所有操作完成之后
處理數據的腳本段在第二個程序中定義
++ -- 增加與減少(前置或后置)
^ ** 指數(右結合性)
! + - 非、一元加號、一元減號
* / % 乘、除、余數
+ - 加、減
< <= == != > >= 比較
&& 邏輯AND( 簡寫)
|| 邏輯OR( 簡寫)
?: 三元條件式
= += -= *= /= %= ^= **= 賦值( 右結合性)
$ 后面跟數字,表示獲取指定列的域,0 代表取整條記錄
ARGC 命令行參數個數
ARGV 命令行參數構成胡數組
FILENAME 當前輸入文件的文件名
FS 設置輸入域分隔符,等價于命令行 -F選項
OFS 輸出域分隔符
RS 控制記錄分隔符
ORS 輸出記錄分隔符
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
FNR 與NR功用類似,不同的是awk每打開一個新文件,FNR便從0重新累計
IGNORECASE 是否忽略大小寫
記錄 默認指的是每行,因為記錄分隔符(RS)是換行符
域 默認指的是每個單詞,因為域分隔符(FS)是空格
awk 通過內建變量 ARGC ( 參數計數 ) 與 ARGV ( 參數向量,或參數值 ) ,讓命令行參數可用。
cat showargs.awk BEGIN { print "ARGC= ", for 0; k<ARGC; k++)
數組
## 數組示例 awk 'BEGIN{x=0;i=0;} \ {name[x++]=$1;} \ END { for(;i<NR;i++){ print "name["i"] is",name[i]} }' mi_info # name[0] is mi6-1
# name[1] is mi6-2
# name[2] is minote3-1
# name[3] is minote3-2
# name[4] is mix2-1
# name[5] is mix2-2
# name[6] is mix2-3
正則表達式元字符
^ 行首定位符
$ 行尾定位符
. 匹配除換行之外的單個字符
\* 匹配0個或者多個前導字符(這里是前導字符0或者多個,任意一個或多個字符,使用 .* )
+ 匹配一個或者多個前導字符
? 匹配0個或者1個前導字符
[] 指定字符中的任意一個字符,比如[Ll] [a-z]
[^] 上面一樣,不匹配的字符
AA|BB 匹配AA或者BB
(AB)+ 匹配一個或者多個AB組合,比如AB,ABAB,ABABAB...
\* 匹配*本身
& 保存查找匹配到的串,可以用在后面的替換中 s/love/**&**/
內置函數
sub(/reg/,替換串[,目標串])
gsub(/reg/,替換串[,目標串])
index(str,sub_str) 返回sub_str第一次在str中出現的位置(偏移量從1開始)
length(str) 返回字符串的字符個數
substr(str,start_pos[,length]) 返回子串,如果沒有length,就到串的末尾
match(str,/reg/) 返回正則匹配在字符串中的位置,同時設置RSTART和RLENGTH的值
split(str,arr_name[,split_sig])
atan2(x,y)
cos(x)
exp(x)
log(x)
sin(x)
sqrt(x)
int(x)直接舍去小數,保留整數部分
rand() 產生隨機數(0~1) srand(x) 初始化隨機數種子
默認情況下每次調用rand(),結果都會產生相同的隨機數,這時候需要調用srand()重新產生一個種子,后面的隨機數才不同
## 函數示例 awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.215969 0.629868
awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.556348 0.749557
awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.0931369 0.835396
條件語句和循環
## 語句和循環示例 (a) if
# 在條件模式中,if是隱含的模式了,而條件語句if也可以按照需要直接聲明出來的句式類似于
if () {} else if else {} awk '{ if( $1 ~ /note/) { print "note related."} else if ( $1 ~ /mix/ ) { print "mix related."} else { print "other ..."} }' mi_info # other ... # other ... # note related. # note related. # mix related. # mix related. # mix related. (b) while
# 句法
while () {} awk 'BEGIN { i = 0; count = 0; } { while ( i < NR ) { i ++; if ( $1 ~ /note/ ) { count++; print NR, $1,$4,$5 } } } END { print "Count:",count }' mi_info # 3 minote3-1 6G 64G # 4 minote3-2 6G 128G # Count: 2
(c) for
# 普通for循環,句法
for( ; ; ){} awk 'BEGIN { i = 0;} { for(;i<NR;i++) { if( $1 ~ /note/ ){ print NR,$1,$4,$5,"~~" } }}' mi_info # 3 minote3-1 6G 64G ~~ # 4 minote3-2 6G 128G ~~ (d) break continue
# 同C/C++語言一樣,是作用于跳出循環體和跳出本次循環的關鍵字。 ### 程序控制語句 (a) next # 從文件中讀取下一行輸入,然后從awk腳本頂部開始重新執行。同continue效果也有點相似,只不過這里是作用于awk工具在對每行操作的自動“循環”中的
(b) exit # 中斷記錄的處理,但是不能夠跳過END語句塊。exit可以帶一個范圍為0~255的退出參數,約定0表示成功,這個退出參數實際就傳遞給了$?表示執行的結果 awk '{ if ( $1 ~ /note/ ) { print NR,$1,$7,"skip"; next; } if ( $1 ~ /mix/ ) { print NR,$1,$7,"exit will"; exit 3; } print NR,$1,$7,"after if..."; } END { print "Fininal should be called here..." }' mi_info # 1 mi6-1 2499 after if... # 2 mi6-2 2899 after if... # 3 minote3-1 2499 skip # 4 minote3-2 2899 skip # 5 mix2-1 3299 exit will # Fininal should be called here... echo $? # 3
系統交互
## (a) 支持 > >> 重定向符號使用的時候作為文件名參數需要使用 "" 括起來,getline可以用于輸入重定向來獲得輸入信息 awk 'BEGIN { "date" | getline date; print "The date is",date > "date.file"}' cat date.file # The date is Wed Dec 28 18:43:39 HKT 2016 ## (b) 管道 | awk '/note/ { print $0 | "grep 2499" }' mi_info # minote3-1 5.5" 660 6G 64G 3500mAh 2499 ## (c) system 函數。可以進行系統命令調用 awk 'BEGIN { system("whoami") }' # root ## (d) printf 格式化輸出信息,跟C語言的類似 awk 'BEGIN { printf "Hello, %s, you are %d years old.\n","Nicol TAO","23"}' # Hello, Nicol TAO, you are 23 years old.
如果處理邏輯復雜,就將代碼寫進文件里,再通過 -f 引用;這樣可防止敲錯代碼。
靈活調用系統命令,內置變量,使代碼更簡潔。
處理大文件時,多審核優化邏輯代碼,可有效提高執行效率。
感謝各位的閱讀,以上就是“awk使用示例分析”的內容了,經過本文的學習后,相信大家對awk使用示例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。