1. 程式人生 > >linux中awk的使用(絕對精華版)

linux中awk的使用(絕對精華版)

art if語句 算法 函數 格式 number num 返回 數值

在linux中awk絕對是核心工具,特別是在查找搜索這一領域,和掌握sed命令一樣重要

下面為awk的一些基本知識,基於這些知識,可以讓你隨意操控一個文件:

在awk中:()括號為條件塊,{}為執行的命令塊

print命令
打印文件內容
awk ‘{print}‘ datafile

-f參數
執行awk腳本,如腳本為hello.awk
awk -f hello.awk datafile

$number
表示記錄的字段,其中$0表示整個串

FS
表示字段分隔符,如下以逗號作為分隔符
awk ‘BEGIN{FS=","}{print}‘ datafile
當寫腳本文件時,一般用FS

-F參數


同FS作用一樣,設置分隔符,如
awk -F "," ‘{print $1}‘ datafile

NF
表示當前記錄行中的字段數量

NR
表示當前記錄的編號,即行號

FNR
當前瀏覽文件的記錄數

FS="\t+"
表示以一個或多個制表符作為分隔符

OFS
字符分隔符,倆個字段間插入分隔符

RS
記錄分隔符,即一行的分隔符

ORS
輸出記錄分隔符,倆個記錄間(行)插入

OFMT 數的輸出格式

CONVFMT 數值的內部轉換格式

布爾表達式
awk -F "," ‘$1=="Hello" {print $1}‘ datafile
只有第一個參數值為Hello時,才打印第二個

length(string1)


返回string1長度

index(string1,string2)
返回string2在string1中的位置,沒有返回0

tolower(string1)/toupper(string1)
返回大小寫

substr(string1,5,3)
從string1的第5位置開始截取長度為3的字段

match(string1,/you/),RSTART,RLENGTH
match匹配的是一個正則表達式
RSTART返回第一個匹配的位置
RLENGTH指定他占據的字符跨度,沒有為-1

gsub/sub(/My/,"You",string1)
gsub全局替換,sub只替換第一個
如上為在string1中查找My並替換為You

split(string1,strarray,",")
print strarray[1],strarray[numelements]
把string1以逗號分割,並傳入到strarray組中
從1開始編號

刪除重復行(必須先排序)
sort datafile|awk ‘{if($0!=line)print;line=$0}‘

FILENAME
awk中特殊存在,用於表示文件
awk ‘END{print FILENAME}‘ datafile
打印file名字
若有多個輸入文件則可以用於判斷,如:
awk ‘if(FILENAME=="file1"){arr[$3]=$1}else{($1 in arr){print arr[$1]"|"$2}} file1 file2
註意:awk先處理前面文件再處理後面文件

ARGIND
當前被處理參數標記

ARGC
命令行參數個數

ARGV
命令行參數排列

ENVIRON
支持隊列中環境變量的使用

next
下一個命令不執行
awk ‘(NR%2=1){next}{print}‘ f1
awk ‘NR==FNR{a[$0]=$0;next}a[$0]{print a[$0],$0}

nextfile
中斷當前文件處理,進入下個文件處理:
awk ‘{print FILENAME;nextfile} f1 f2
打印倆個文件名,多用於查找文件

exit
停止awk,並執行END語句塊後退出

定義函數:
awk ‘{print "sum=",sqrtsum($1,$2)}function sqrtsum(x,y){return x*x+y*y}‘ file
awk ‘{print "sum=",$1*$1+$2*$2}

-v
加載環境或shell中的參數
awk-F \| -v ORAHOME=${ORA_HOME} ‘{print $1"|"ORAHOME>"datafile1"} datafile
或者如下:
awk-F \| ‘{print $1"|"ORAHOME>"datafile1"} ORAHOME=${ORA_HOME} datafile

getline
獲取文件的行內容,一般放在BEGIN中
一個getline獲取一行,也可以保存到變量
awk ‘BEGIN{getline var1}END{print var1}‘ file

打印5行之後的行:
awk ‘NR>5‘ file
打印2到6行:
awk ‘NR==2,NR==6‘ file
打印前5行:
awk ‘!(NR>5)‘ file
awk ‘NR<6‘ file
打印5倍數的行:
awk ‘(NR%10==0){print}‘ file
awk ‘!(NR%10){print}‘ file

awk中相關操作符使用

~操作符
倆邊匹配符,可模糊比較,如:
awk ‘BEGIN{FS="|"}($2~/..My./){print}‘ file

比較運算符
==倆邊相等
>
>=
<
<=
!=倆邊不等
~ 匹配正則表達式
!~ 不匹配正則表達式
‖邏輯或
&& 邏輯與

算術運算符
+ 加法
- 減法
* 乘法
/ 除法
^ 指數算法
% 模算法
-- 自-1(前後自減)
++ 自+1(前後自加)
+= 自加算法
-= 自減算法
*= 自乘算法
/= 自除算法
^= 自指數算法
%= 自模算法

統計文本中空行數量
awk ‘BEGIN{x=0}/^$/{x+=1}END{print x}‘ datafile
/^$/表示空行

正則表達式:
\ 轉義符
^ 行首符
$ 行尾符
. 匹配一個字符
[ ] 匹配其中一個字符
| 或操作
( ) 判斷語句
* 匹配0個或多個前面的字符
+ 匹配前面一個或多個字符
? 匹配模式出現頻率


if語句
if($1=="foo"){
print "foo"
}else if($1=="bar"){
print "bar"
}else{
print "other"
}

do..while語句
{
count=6
do{
print count
count--
}while(count!=1)
}

while語句
{
while(x<NF){
print $x
x++
}
}


for語句
for(x=1;x<=5;x++){
print x
}

linux中awk的使用(絕對精華版)