awk 命令在處理文字中的應用

2021-07-15 10:04:51 字數 4154 閱讀 4213

awk命令在處理文字中很方便,最近總結了一些awk的具體應用。

1、awk引數介紹

先寫乙個常用命令:

cat 4653_trans_out |awk -f','

''

-f',' 是文字中的每一行按逗號分割

$0 是文字中的每一行

$1 是文字中每一行切割後的第乙個字段

awk內建變數介紹:

記錄變數:

fs: field separator,讀取文字時所使用的字段分隔符

rs: record separator,讀取文字資訊所使用的換行符

ofs: output filed separator: 輸出文字時使用的字段分隔符

ors:output row separator:輸出文字時使用的行分隔符

資料變數:

nr: the number of input records,awk命令所處理的記錄數;如果有多個檔案,這個數目會把處 理的多個檔案中行統一計數;

nf:number of field,當前記錄的field個數;

fnr: 與nr不同的是,fnr用於記錄正處理的行是當前這一檔案中被總共處理的行數;

argv: 陣列,儲存命令列本身這個字串,如awk '' a.txt b.txt這個命令中,argv[0]儲存awk,argv[1]儲存a.txt;

argc: awk命令的引數的個數;

filename: awk命令所處理的檔案的名稱;

environ:當前shell環境變數及其值的關聯陣列;

awk自定義變數:

awk允許使用者自定義自己的變數以便在程式**中使用,變數名命名規則與大多數程式語言相同,只能使用字母、數字和下劃線,且不能以數字開頭

例項:awk 'begin'

awk -v var="variable testing" 'begin'

2、awk中的程式設計語句

(1、awk中if的應用

例項命令如下:

cat 4653_trans_out |awk -f','

'}'

例項的命令是如果檔案中每一行第5個字段的後四位如果是0446 就輸出這一行
(2、awk中while的應用

例項命令如下:

awk -f: '; i++}}' /etc/passwd
awk -f: '' /etc/passwd
(4、awk中使用陣列

例項如下:

array[index-expression]

index-expression可以使用任意字串;需要注意的是,如果某資料組元素事先不存在,那麼在引用其時,awk會自動建立此元素並初始化為空串;因此,要判斷某資料組中是否存在某元素,需要使用index in array的方式。要遍歷陣列中的每乙個元素,需要使用如下的特殊結構:

for (var in array)

顯示各個shell的個數和

awk -f: 'end}' /etc/passwd

刪除陣列變數:

從關係陣列中刪除陣列索引需要使用delete命令。使用格式為

delete array[index]

(5、awk中內建函式:

split(string, array [, fieldsep [, seps ] ])

功能:將string表示的字串以fieldsep為分隔符進行分隔,並將分隔後的結果儲存至array為名的陣列中;陣列下標為從0開始的序列;

netstat -ant | awk 『/:80>/end}』 | sort -rn | head -50

length([string])

功能:返回string字串中字元的個數;

substr(string, start [, length])

功能:取string字串中的子串,從start開始,取length個;start從1開始計數;

system(command)

功能:執行系統command並將結果返回至awk命令

systime()

功能:取系統當前時間

tolower(s)

功能:將s中的所有字母轉為小寫

toupper(s)

功能:將s中的所有字母轉為大寫

(6、awk自定義函式

awk的函式可以在引號中的任意地方定義,用{}括起即可,可以定義引數,但呼叫時可帶可不帶:

如:顯示每行前兩個域的較大值的函式如下:

1.  awk '

2. function max(a,b,c)

3.

6. ' file

說明:顯示每行前兩個域的較大值,max為函式名,a、b為引數,(類似於c語言的形參)
3、awk的模式

awk 'program' input-file1 input-file2
其中的program為:

pattern

pattern

常見的模式型別:

(1、regexp: 正規表示式,格式為/regular expression/

例如:顯示以r開頭的行

awk -f: '/^r/' /etc/passwd
(2、expresssion:表示式,其值非0或為非空字元時滿足條件,如:$1 ~ /foo/ 或 $1 == "magedu",用運算子~(匹配)和~!(不匹配)。

例題:顯示id號小於等於5的使用者和id號

awk -f: '$3-1<5' /etc/passwd

awk -f: '$3

<=5' /etc/passwd

取出預設shell為bash的使用者
awk -f: '$7~"bash$"' /etc/passwd
顯示預設shell不是bash的使用者
awk -f: '$7!~"bash"' /etc/passwd
(3、ranges: 指定的匹配範圍,格式為pat1,pat2

顯示id號為0或者shell為/sbin/nologin的使用者

awk -f: '$3==0,$7~"nologin"' /etc/passwd
(4、begin/end:特殊模式,僅在awk命令執行前執行一次或結束前執行一次

awk -f: '$3==0,$7~"nologin"' /etc/passwd
可以在顯示時顯示表頭
awk -f: 'begin' /etc/passwd
顯示表頭和表尾
awk -f: 'begin end

' /etc/passwd

(5、empty(空模式):匹配任意輸入行,對檔案中的每一行做匹配

awk -f:  '' /etc/passwd
awk 更改原始檔內容

原始檔內容如下:

li      120     abc

wang 500 bcd

zhng 180 abc

給第一列為zhng的行的第二列加上200

awk -f'\t'

'$1 ~ /zhng/1' test.txt 1

<> test.txt

執行結果:

li  120 abc

wang 500 bcd

zhng 380 abc

awk 直接覆蓋原始檔內容

awk '' test.txt | tee test.txt

awk語法與文字應用處理

awk命令的一般形式 awk begin pattern1 pattern2 patternn end input filename 其中,begin 和 end 是可選的。awk的執行過程如下 1,如果存在begin,awk首先執行它指定的actions。2,awk從輸入中讀取一行,稱為一條輸入記...

awk處理多行文字的記錄

awk使用內建的變數rs將輸入流拆分為乙個個記錄 record 使用fs將乙個記錄拆分為若干個域 field rs的預設值為 n,fs的預設值為空白字元。有時候會出現乙個記錄跨越多行的情況,這時就需要手動設定rs為記錄中不會出現的字元 否則會將乙個記錄拆分為兩個記錄 如空行 rs 分頁符 rs f ...

shell中的awk應用

概念 awk是乙個資料處理工具!相較於sed是對一整行的處理 而awk則是比較傾向於 把一行分成多個欄位來處理 在linux 中常用的是gwak awk是gawk的鏈結檔案 awk語法格式 awk f begin 匹配規則 end filename 其中begin和end 是awk的關鍵字 因此必須...