linux awk 強大的文字處理命令(原創)

2021-08-20 17:34:45 字數 4275 閱讀 3922

說明:強大的文字分析語言和工具,一行一行處理,不會記憶體溢位等問題

強大功能:提取特定的行、指定格式輸出、指定格式分割

兩種用法:

命令

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...