說明:強大的文字分析語言和工具,一行一行處理,不會記憶體溢位等問題
強大功能:提取特定的行、指定格式輸出、指定格式分割
兩種用法:
命令
awk [選項] 'script' var=value files
指令碼
awk [選項] -f scriptfile var=value files
選項(常用的選項):
簡寫全稱
說明-f fs
--field-separator fs
指定分隔符fs,fs可以是字串或表示式
-f scriptfile
--file scriptfile
執行awk指令碼,裡面是awk命令,指令碼名隨便取
-v var=value
--asign var=value
給變數var賦值value
內部變數(表摘自菜鳥教程)
變數
描述
\$n當前記錄的第
n個字段,欄位間由
fs分隔
\$0完整的輸入記錄
filename
當前檔名
fnr各檔案分別計數的行號
fs欄位分隔符
(預設是任何空格
)ignorecase
如果為真,則進行忽略大小寫的匹配
nf一條記錄的字段的數目
nr已經讀出的記錄數,就是行號,從1開始
ofs輸出記錄分隔符(輸出換行符),輸出時用指定的符號代替換行符
ors輸出記錄分隔符
(預設值是乙個換行符)rs
記錄分隔符
(預設是乙個換行符
)subsep
陣列下標分隔符
(預設值是
/034)
基本用法:
salary.txt 薪水內容,名字,日期,薪水:
sam,2012-01-11,1000
tom,2012-01-11,2000
john,2012-01-13,3000
sam,2012-01-11,2000
tom,2013-01-20,3000
john,2013-01-28,4000
例項一:
awk -f, -v ofs="\t" '' salary.txt
sam 1000
tom 2000
john 3000
sam 2000
tom 3000
john 4000
分析:-f 用,分割資料成,$1,$3 輸出第
一、第三個字元,-v ofs="\t" 用製表符隔開輸出的字段,ofs預設空格
特徵:輸入、輸出格式都可以控制,還可以用printf 控制輸出
例項二
awk -f, -v ofs="\t" '$3~/[3-4]000/' salary.txt
john
3000
3tom
3000
5john
4000
6分析:$3~/[3-4]000/ 顯示第三列滿足該正則(3000-4000)的資料,nr是已經讀出的記錄數,沒有顯示也數,從1開始
特徵:挑選某些資料,合理利用內建變數有時很方便
運算子(表摘自菜鳥教程)
運算子
描述
= += -= *= /= %= ^= **=
賦值?:
c條件表示式
||邏輯或
&&邏輯與
~ ~!
匹配正規表示式和不匹配正規表示式
< <= > >= != ==
關係運算子
空格連線
+ -加,減
* / %
乘,除與求餘
+ - !
一元加,減和邏輯非
^ ***
求冪++ --
增加或減少,作為字首或字尾
$字段引用
in陣列成員
例項三
awk -f, -v ofs="\t" '$3>=2000 && $3<=3000' salary.txt
分析:改例項二,不用正則,用運算子,$3>=2000 && $3<=3000,輸出同樣結果
例項四
awk -f, -v ofs="\t" 'beginend' salary.txt
namesalary
sam1000
tom 2000
john 3000
sam 2000
tom 3000
john 4000
tatol salary:15000
分析:用begin、end做前期和後期工作,sum把第三列工資加起來,在end中用printf輸出
特徵:前後期工作可以做一些工作,end不想用\t分割輸出,就利用printf控制輸出格式
內建函式
函式
說明
rand( )
返回任意數
n,其中
0 <= n < 1
。srand( [expr] )
將rand
函式的種子值設定為
expr
,如果省略
expr
引數則使用某天的時間。返回先前的種子值。
sub( ere, repl, [ in ] )在in
(預設是整個記錄(
$0 記錄變數))中,用
repl
代替ere
匹配到的字串,代替一次。返回值是替換的次數。
gsub( ere, repl, [ in ] )
替換所有匹配到字串,其他和
sub
函式一樣。
index( string1, string2 )
返回string2
在string1
的位置,從
1開始。不在就返回
0length [(string)]
返回string
的長度(位元組),
string
預設是$0
substr( string, start, [ length ] )
取string
的子字串,從
start
開始,取
length
個字元(
預設就到末尾
)match( string, ere )
符合ere
的子字串
在string
中位置,沒有就返回
0。返回值是
rstart
特殊變數
split( string, a, [ere] )
用ere或fs
特殊變數對
string
分割,用陣列
a儲存。
tolower( string )
把string
的每個字元都變為小寫
toupper
(string)把
string
的每個字元都變為大寫
例項五:
awkscript內容如下:
begin
}end
awk -f awkscript salary.txt
name
oldname
salary
tom
tom
2000
john
john
3000
sam
sam
2000
tom
tom
3000
total salary:10000
分析:執行指令碼,選工資2000-3000的,sum記錄滿足條件全部工資,tolower把名字都小寫,match找wo位置,記錄在rsart
特徵:利用內部函式,快速完成某功能,或者自己做功能,比如統計總工資
Linux awk 文字處理工具五
awk 線上處理常用模式 awk 處理複雜日誌 6.19 dhb 014 號百總機服務業務 廣州 到達數異常!6.20 dhb 014 號百總機服務業務 廣州 到達數異常!到 awk f nf 2 當前行nf小於等於2 只針對 有效 即 6.19 行跳過此操作,仍然執行 當前行nf大於2 執行到 n...
Linux awk 文字處理工具四
awk 常用示例 獲取本機 ip 方式 sbin ifconfig awk v rs bcast awk f addr 直接獲取當前 ip 位址 sbin ifconfig awk inet 2 127.0.0.1 也是 直接獲取當前 ip 位址 sbin ifconfig awk v rs ine...
Linux awk 文字處理工具三
awk 檔案列印匹配 格式示例 awk tom file 列印匹配到得行 awk tom 匹配tom開頭的行 列印第乙個字段 awk 1 ly 顯示所有第乙個字段不是以ly結尾的行 awk 3 40 如果第三個字段值小於40才列印 awk 4 90 取出第四列等於90的第五列 awk no so t...