shell腳本三劍客之awk命令-創新互聯

awk:

創新互聯主營江蘇網站建設的網絡公司,主營網站建設方案,重慶App定制開發,江蘇h5微信平臺小程序開發搭建,江蘇網站營銷推廣歡迎江蘇等地區企業咨詢

測試用模版:

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

模式和動作:

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

 模式可以是任何條件語句或復合語句或正則表達式也包括兩個特殊字段BEGIN和END。

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

awk腳本的輸入方法:

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

方法一:test.awk abc.txt

方法二:test.awk < abc.txt

方法三:abc.txt | test.awk

awk使用時出現錯誤的原因:

確保整個awk命令用單引號括起來。

確保命令內所有引號成對出現。

確保用花括號括起動作語句,用圓括號括起條件語句。

可能忘記使用花括號,也許你認為沒有必要,但awk不這樣認為,將按之解釋語法。

NR:表示awk開始執行程序后所讀取的數據行數

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

1

2

3

4

5

釋:也可以在花括號前加入END字段,表示打印最后一行行數。

$NF:最后一列數據

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

44.44

2678.

2658

266666

44544

釋:可以在花括號前加入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是將管道符前面的結果保存到wow文件中同時標準輸出在屏幕上。

打印報告頭和結束尾:

例:[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“執行tab鍵

正則表達式:

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

\ :轉意符號,如果在命令中有特殊符號,但是不想用特殊符號的功能只需要在特殊符號前加轉義符號。

. :一位任意數

[] :為查詢大小寫信息.

() :使用條件語句需要用圓括號。

* :多位任意數。

^ :匹配模式頭部分

$ :匹配模式尾部分

| :或

? :匹配可能出現的字符

+ :使用+匹配一個或多個字符

條件操作符:

> :小于

例:[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

~ :匹配正則表達式

例:[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

!~ :不匹配正則表達式

例:[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

釋:匹配開頭前三位是任意字符第四位是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

符合模式:

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

例[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內置變量:

NR:文件行數

NF:域塊個數

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

設置輸入域到域變量名:

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

P.Bunnyaaa    ok

釋:注意分號的使用,它分隔 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表達式進行改動時減少很多麻煩。

修改數值域取值:

例:[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從原來的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

釋:所有數字都減一。

修改文本域:

例:[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

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

只顯示修改記錄:

例:[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

釋:注意花括號的位置

創建新的輸出域:

例:[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

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

例:[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

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

文件長度相加:

例:[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

釋:數值相加的總和有偏差,應該是單位換算導致的結果有誤。具體后期查一下。

替換(gsub):

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

M.Tansley 05/99 48311 abcd  8  40 44.44

釋:整個記錄中替換一個字符串為另一個,使用正則表達式格式, /目標模式/,替換模式

awk簡單腳本:

例:[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腳本加權限chmod u+x jiaoben ,不能這樣使用sh jiaoben data.f。

釋:tot/NR是tot總數除以行數(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

釋:將打印的結果已冒號分隔又叫輸出分隔符

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享標題:shell腳本三劍客之awk命令-創新互聯
網站路徑:http://m.kartarina.com/article30/cddgpo.html

成都網站建設公司_創新互聯,為您提供做網站、網站排名標簽優化、網站設計、靜態網站、網站設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站優化排名
主站蜘蛛池模板: 无码任你躁久久久久久老妇| 亚洲Av无码国产一区二区| 国产精品无码翘臀在线观看| 无码日韩人妻精品久久| 亚洲一级特黄无码片| 日韩免费无码视频一区二区三区| 无码中文av有码中文av| 中文字幕无码无码专区| 亚洲AV中文无码字幕色三| 无码国产精品一区二区免费式直播| 国产成人无码免费视频97| 久久亚洲AV成人无码| 亚洲国产成人精品无码区在线观看| 加勒比无码一区二区三区| 少妇无码AV无码专区在线观看| 无码人妻精品一区二区三区99不卡| 久久午夜无码鲁丝片秋霞| 无码专区天天躁天天躁在线| 成在人线av无码免费高潮水| 97精品人妻系列无码人妻| 亚洲国产精品无码久久一线| 中文字字幕在线中文无码| 人妻无码aⅴ不卡中文字幕| 亚洲中文无码亚洲人成影院| 人妻无码视频一区二区三区 | 亚洲精品无码不卡| 免费无码又爽又刺激网站直播 | 国产亚洲大尺度无码无码专线| 亚洲AV无码一区二区乱子仑 | 日韩精品无码中文字幕一区二区| 亚洲av无码天堂一区二区三区 | 无码中文字幕色专区| 伊人无码精品久久一区二区 | 久久久久亚洲av成人无码电影 | 亚洲午夜AV无码专区在线播放| 无码不卡中文字幕av| 精品无码黑人又粗又大又长| 四虎成人精品国产永久免费无码 | 亚洲中文字幕不卡无码| 国产精品热久久无码av| 国内精品无码一区二区三区|