您好,登錄后才能下訂單哦!
awk:
測試用模版:
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
模式和動作:
最常用的動作是打印(print)也有較長的動作代碼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
釋:將打印的結果已冒號分隔又叫輸出分隔符
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。