溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

shell腳本三劍客之a(chǎn)wk命令

發(fā)布時(shí)間:2020-07-20 00:25:08 來(lái)源:網(wǎng)絡(luò) 閱讀:676 作者:linux阿輝 欄目:網(wǎng)絡(luò)安全

awk:


測(cè)試用模版:

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544



模式和動(dòng)作:

  最常用的動(dòng)作是打?。╬rint)也有較長(zhǎng)的動(dòng)作代碼if和while和for,

  模式可以是任何條件語(yǔ)句或復(fù)合語(yǔ)句或正則表達(dá)式也包括兩個(gè)特殊字段BEGIN和END。

BEGIN的使用是在awk正式對(duì)文本做讀取操作之前,END則是在awk在做完所有操作之后


awk腳本的輸入方法:

腳本名(test.awk) 文件名(abc.txt)正規(guī)使用方法為方法一

方法一:test.awk abc.txt

方法二:test.awk < abc.txt

方法三:abc.txt | test.awk


awk使用時(shí)出現(xiàn)錯(cuò)誤的原因:

確保整個(gè)awk命令用單引號(hào)括起來(lái)。

確保命令內(nèi)所有引號(hào)成對(duì)出現(xiàn)。

確保用花括號(hào)括起動(dòng)作語(yǔ)句,用圓括號(hào)括起條件語(yǔ)句。

可能忘記使用花括號(hào),也許你認(rèn)為沒(méi)有必要,但awk不這樣認(rèn)為,將按之解釋語(yǔ)法。


NR:表示awk開(kāi)始執(zhí)行程序后所讀取的數(shù)據(jù)行數(shù)

例:[root@localhost awk]# awk '{print NR}' data.f     

1

2

3

4

5

釋:也可以在花括號(hào)前加入END字段,表示打印最后一行行數(shù)。


$NF:最后一列數(shù)據(jù)

例:[root@localhost awk]# awk '{print $NF}' data.f    

44.44

2678.

2658

266666

44544

釋:可以在花括號(hào)前加入END,表示打印最后一行的最后一列。


保存輸出:

例:[root@localhost awk]# awk '{print $0}' data.f |tee wow

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

釋:"$0"打印全行,tee是將管道符前面的結(jié)果保存到wow文件中同時(shí)標(biāo)準(zhǔn)輸出在屏幕上。


打印報(bào)告頭和結(jié)束尾:

例:[root@localhost awk]# awk 'BEGIN {print "name     color\n------------------------"} {print $1,$4}' data.f     

name     color

------------------------

M.Tansley Green

J.Lulu green

P.Bunnyaaa Yellow

J.Troll Brown-3

L.Tansleyaaa Brown-2

釋:”\n“另起一行


例:[root@localhost awk]# awk 'BEGIN {print "name     color\n---------------"} {print $1,$4} END {print "\n-----------jieshu"}' data.f 

name     color

--------------------

M.Tansley Green

J.Lulu green

P.Bunnyaaa Yellow

J.Troll Brown-3

L.Tansleyaaa Brown-2


---------------jieshu


[root@localhost awk]# awk 'BEGIN {print "name\tcolor"} {print $1"\t" $2}' data.f    

name    color

M.Tansley       05/99

J.Lulu  06/99

P.Bunnyaaa      02/99

J.Troll 07/99

L.Tansleyaaa    05/99

釋:”\t“執(zhí)行tab鍵


正則表達(dá)式:

在awk中正則表達(dá)式是使用斜線來(lái)表示的,例如,查找Green字符可以這樣表達(dá)"/Green/",在awk中可以使用的元字符有如下;

\ :轉(zhuǎn)意符號(hào),如果在命令中有特殊符號(hào),但是不想用特殊符號(hào)的功能只需要在特殊符號(hào)前加轉(zhuǎn)義符號(hào)。

. :一位任意數(shù)

[] :為查詢大小寫(xiě)信息.

() :使用條件語(yǔ)句需要用圓括號(hào)。

* :多位任意數(shù)。

^ :匹配模式頭部分

$ :匹配模式尾部分

| :或

? :匹配可能出現(xiàn)的字符

+ :使用+匹配一個(gè)或多個(gè)字符


條件操作符:

> :小于

例:[root@localhost awk]# awk '$3 < "48" {print $0}' data.f 

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

例:[root@localhost awk]# awk '{if($6 > $7) print $1 "\tok"}' data.f.bak 

J.Troll ok


<= :小于等于

例:[root@localhost awk]# awk '$3 <= "48" {print $0}' data.f 

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544


== :等于

例:[root@localhost awk]# awk '$3 == "48" {print $0}' data.f 

P.Bunnyaaa   02/99 48    Yellow  12 35 2658


!= :不等于

例:[root@localhost awk]# awk '$3 != "48" {print $0}' data.f 

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

例:[root@localhost awk]# awk '$0 !~ /Brown/' data.f 

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658


>= :大于等于

例:[root@localhost awk]# awk '$3 >= "48" {print $0}' data.f 

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

J.Troll   07/99 4842  Brown-3 12 26 266666


~ :匹配正則表達(dá)式

例:[root@localhost awk]# awk '{if ($4~/Brown/) print $0}' data.f 

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

例:[root@localhost awk]# awk '$0 ~/Brown/' data.f 

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544



!~ :不匹配正則表達(dá)式

例:[root@localhost awk]# awk '$0 !~/Brown/' data.f 

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

例:[root@localhost awk]# awk '{if ($4 !~/Brown/) print $0}' data.f 

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658


任意字符匹配:

例:[root@localhost awk]# awk '$0~/^...a/ ' data.f

M.Tansley 05/99 48311 Green   8  40 44.44

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

釋:匹配開(kāi)頭前三位是任意字符第四位是a的字段。


“或”的使用:

例:[root@localhost awk]# awk '$0 ~ /(Brown|gree)/' data.f

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

例;[root@localhost awk]# awk '$0 ~ /(Brown|[Gg]ree)/' data.f

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544


行首:

例:[root@localhost awk]# awk '/^J/' data.f

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666


符合模式:

&& :兩邊的是都為真,才能打印信息。(只針對(duì)一行有效)

例[root@localhost awk]# awk '{if ($3~/48/ && $4~/[Gg]reen/) print $0}' data.f

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.


|| :一邊為真或全部為真

例:[root@localhost awk]# awk '{if ($0~/Brown/ || $4~/[Gg]reen/) print $0}' data.f

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544



awk內(nèi)置變量:

NR:文件行數(shù)

NF:域塊個(gè)數(shù)

FILENAME:所指定的文件名

例:[root@localhost awk]# awk '{print NR,NF,$0} END{print FILENAME}' data.f

1 7 M.Tansley 05/99 48311 Green   8  40 44.44

2 7 J.Lulu    06/99 48317 green   9  24 2678.

3 7 P.Bunnyaaa   02/99 48    Yellow  12 35 2658

4 7 J.Troll   07/99 4842  Brown-3 12 26 266666

5 7 L.Tansleyaaa 05/99 4712  Brown-2 12 30 44544

data.f


例:[root@localhost awk]# echo $PWD |awk -F"/" '{print $NF}' 

awk


設(shè)置輸入域到域變量名:

例:[root@localhost awk]# awk '{name=$1;color=$4;if(color~/Ye/) print name "\tok"}' data.f

P.Bunnyaaa      ok

釋:注意分號(hào)的使用,它分隔 awk命令。


為變量賦值:

例:[root@localhost awk]# awk '{if ($6 < "27") print $0}' data.f

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666


例:[root@localhost awk]#  awk 'BEGIN{shuzi="27 "} {if ($6 < shuzi) print $0}' data.f

J.Lulu    06/99 48317 green   9  24 2678.

J.Troll   07/99 4842  Brown-3 12 26 266666

釋:通常在BEGIN部分賦值是很有益的,可以在awk表達(dá)式進(jìn)行改動(dòng)時(shí)減少很多麻煩。


修改數(shù)值域取值:

例:[root@localhost awk]# awk '{if ($1=="M.Tansley") $6=$6-1;print $1,$6,$7}' data.f

M.Tansley 39 44.44

J.Lulu 24 2678.

P.Bunnyaaa 35 2658

J.Troll 26 266666

L.Tansleyaaa 30 44544

釋:M.Tansley從原來(lái)的40下降到39。


例:[root@localhost awk]# awk '{if ($1==$1) $6=$6-1;print $1,$6,$7}' data.f

M.Tansley 39 44.44

J.Lulu 23 2678.

P.Bunnyaaa 34 2658

J.Troll 25 266666

L.Tansleyaaa 29 44544

釋:所有數(shù)字都減一。


修改文本域:

例:[root@localhost awk]# awk '{if ($1=="P.Bunnyaaa") ($1="P.Bunnyaaa.abcaaa");print $1}' data.f

M.Tansley

J.Lulu

P.Bunnyaaa.abcaaa

J.Troll

L.Tansleyaaa

釋:記住字符串要使用雙秒號(hào)( " ")不要忘記分號(hào)(;) ,并用圓括號(hào)括起整個(gè)語(yǔ)法。


只顯示修改記錄:

例:[root@localhost awk]# awk '{if ($1=="M.Tansley") {$1="M.Tansley.abc";print $1}}' data.f

M.Tansley.abc

例:[root@localhost awk]# awk '{if ($1=="M.Tansley") {$1="M.Tansley.abc";print $0}}' data.f

M.Tansley.abc 05/99 48311 Green 8 40 44.44

釋:注意花括號(hào)的位置


創(chuàng)建新的輸出域:

例:[root@localhost awk]# awk 'BEGIN{print "name\t fenzhi"} {if ($5 < $6) {$8=$6-$5;print $1,$8}}' data.f

name     fenzhi

M.Tansley 32

J.Lulu 15

P.Bunnyaaa 23

J.Troll 14

L.Tansleyaaa 18

釋:在輸出結(jié)果前打印一個(gè)頭,然后在比較數(shù)值,“$8=$6-$5”這是在為$8賦值。記住使用語(yǔ)法的格式。


例:[root@localhost awk]# awk 'BEGIN{print "name \t shuzi"} {if ($5 < $6);diff=$6-$5;print $1,diff}' data.f

name     shuzi

M.Tansley 32

J.Lulu 15

P.Bunnyaaa 23

J.Troll 14

L.Tansleyaaa -90

釋:也可以使用域變量名。


文件長(zhǎng)度相加:

例:[root@localhost awk]# ll -h |awk '/^[^d]/ {print $8"\t"$5} {tol+=$5} END{print "zongshu:" tol}' 

data.f  217

data.f.bak      201

zongshu:422

釋:數(shù)值相加的總和有偏差,應(yīng)該是單位換算導(dǎo)致的結(jié)果有誤。具體后期查一下。


替換(gsub):

例:[root@localhost awk]# awk 'gsub (/Green/,"abcd") {print $0}' data.f

M.Tansley 05/99 48311 abcd   8  40 44.44

釋:整個(gè)記錄中替換一個(gè)字符串為另一個(gè),使用正則表達(dá)式格式, /目標(biāo)模式/,替換模式


awk簡(jiǎn)單腳本:

例:[root@localhost awk]# cat jiaoben 

#!/bin/awk -f

#

BEGIN{

print "hello"

print "chengjiruxia"

print "===================================="


}

(tot+=$6)

END{print "zongshu:" tot

print "pingjunshu" tot/NR}


釋:要給awk腳本加權(quán)限chmod u+x jiaoben ,不能這樣使用sh jiaoben data.f。

釋:tot/NR是tot總數(shù)除以行數(shù)(NR)

例:[root@localhost awk]# ./jiaoben data.f

hello

chengjiruxia

====================================

M.Tansley 05/99 48311 Green   8  40 44.44

J.Lulu    06/99 48317 green   9  24 2678.

P.Bunnyaaa   02/99 48    Yellow  12 35 2658

J.Troll   07/99 4842  Brown-3 12 26 266666

L.Tansleyaaa 05/99 4712  Brown-2 120 30 44544

zongshu:155

pingjunshu31




例:[root@localhost awk]# awk 'BEGIN{OFS=":"}{print $1,$3,$4}' digresult.txt 

news.sina.com.cn:111.12.251.212:111.12.251.203

jupiter.sina.com.cn:111.12.251.217:111.12.251.212

cmnetnews.sina.com.cn:111.12.251.219:111.12.251.217

us.sina.com.cn:111.12.251.212:111.12.251.203

www.sina.com:111.12.251.212:111.12.251.203

釋:將打印的結(jié)果已冒號(hào)分隔又叫輸出分隔符





向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI