1. 程式人生 > >**awk內建函式小節**

**awk內建函式小節**

awk提供了許多強大的字串函式,見下表: 
awk內建字串函式 
gsub(r,s) 在整個$0中用s替代r 
gsub(r,s,t) 在整個t中用s替代r 
index(s,t) 返回s中字串t的第一位置 
length(s) 返回s長度
match(s,r) 測試s是否包含匹配r的字串 
split(s,a,fs) 在fs上將s分成序列a 
sprint(fmt,exp) 返回經fmt格式化後的exp 
sub(r,s) 用$0中最左邊最長的子串代替s ,該字串是r
substr(s,p) 返回字串s中從p開始的字尾部分 
substr(s,p,n) 返回字串s中從p開始長度為n的字尾部分 

詳細說明一下各個函式的使用方法。 
gsub函式有點類似於sed查詢和替換。它允許替換一個字串或字元為另一個字串或字元,並以正則表示式的
形式執行。第一個函式作用於記錄$0,第二個gsub函式允許指定目標,然而,如果未指定目標,預設為$0。

index(s,t)函式返回目標字串s中查詢字串t的首位置。length函式返回字串s字元長度。match函式測試字
符串s是否包含一個正則表示式r定義的匹配。split使用域分隔符fs將字串s劃分為指定序列a。sprint函式類
似於printf函式(以後涉及),返回基本輸出格式fmt的 結果字串exp。sub(r,s)函式將用s替代$0中最左邊最長

的子串,該子串被(r)匹配。 substr(s,p)返回字串s在位置p後的字尾。substr(s,p,n)是輸出字串s,從第p

個字元到第n個字元。現在看一看awk中這些字串函式的功能。 

1.gsub 
要在整個記錄中替換一個字串為另一個,使用正則表示式格式,/目標模式/
替換模式 /。例如改變學生序號
4842到4899: 
$ awk 'gsub(/4842/, 4899) {print $0}' grade.txt 
J.Troll 07/99 4899 Brown-3 12 26 26 

2.index 
查詢字串s中t出現的第一位置。必須用雙引號字串括起來。例如返回目標字串 Bunny中ny出現的第一位
,即字元個數。 
$ awk 'BEGIN {print index("Bunny","ny")}  grade.txt


3.length 
返回所需字串長度,例如檢驗字串J.Troll返回名字及其長度,即人名構成的字元個數。 
$ awk '$1=="J.Troll" {print length($1)  " " $1}' grade.txt 

7 J.Troll 

這個還可以這樣寫:

echo "J.Troll 07/99 4824 Brown-3 12 26 26 "| awk '{if ($1~"J.Troll") print length($1), $1}'

也就是awk ' {if ($1~"J.Troll") print length($1)  " " $1}' grade.txt 

還有一種方法,這裡字串加雙引號。 
$ awk 'BEGIN {print length("A FEW GOOD MEN")}'BEGIN/END:指定開始和結束規則
14 

4.match 
match測試目標字串是否包含查詢字元的一部分。可以對查詢部分使用正則表示式,返回值為成功出現的字元排
列數
。如果未找到,返回0,第一個例子在ANCD中查詢d。因其不存在,所以返回0。第二個例子在ANCD中查詢D。因
其存在,所以返回ANCD中D出現的首位置字元數。第三個例子在學生J.Lulu中查詢u。 
$ awk 'BEGIN {print match("ANCD", /d/)}' 

$ awk 'BEGIN {print match("ANCD", /C/)}' 

$ awk '$1=="J.Lulu" {print match($1, "u")} grade.txt 【注意:如果匹配的是個字串的話,必須加上雙引號


5.split 
使用split返回字串陣列元素個數。工作方式如下:如果有一字串,包含一指定分隔符-,例如AD2-KP9-JU2-

LP-1,將之劃分成一個數組。使用split,指定分隔符及陣列名。此例中,命令格式為("AD2-KP9-JU2-LP-

1",parts_array,”-”),split然後返回陣列下標數,這裡結果為4。
還有一個例子使用不同的分隔符。 
$ awk 'BEGIN {print split("123#456#678", myarray, "#")}' 

這個例子中,split返回陣列myarray的下標數。陣列myarray取值如下: 
Myarray[1]="123" 
Myarray[2]="456" 

Myarray[3]="678"

6.sub 
使用sub發現並替換模式的第一次出現位置。字串STR包含'popedpopopill',執行下列sub命令sub
(/op/,"op",STR)。模式op第一次出現時,進行替換操作,返回結果如下: 
'pOPedpopepill'。
假如grade.txt檔案中,學生J.Troll的記錄有兩個值一樣,“目前級別分”與“最高級別分”。只改變第一個為
29,第二個仍為26不動,操作命令為sub(/26/,"29",$0),只替換第一個出現 26的位置。
$ awk '$1=="J.Troll" ,sub(/26/, "29", $0)' grade.txt 
L.Troll 07/99 4842 Brown-3 12 29 26 

L.Transley 05/99 4712 Brown-2 12 30 28 

ps:若將上面的換成gsub,結果就不一樣了

[[email protected] zy]# echo "J.Troll 07/99 4824 Brown-3 12 26 26 "| awk '$1=="J.Troll",gsub(/26/,"29",$0)'

J.Troll 07/99 4824 Brown-3 12 29 29 

7.substr 
substr是一個很有用的函式。它按照起始位置及長度返回字串的一部分。例子如下: 
$ awk '$1=="L.Transley" {print substr($1, 1,5)}' grade.txt 
L.Tan 
上面例子中,指定在域1的第一個字元開始,返回其前面5個字元。
如果給定長度值遠大於字串長度, awk將從起始位置返回所有字元,要抽取L.Tansley的姓,只需從第3個字元
開始返回長度為7。可以輸入長度99,awk返回結果相同。 
$ awk '{$1=="L.Transley" {print substr($1, 3,99)}' grade.txt 
Transley 

substr的另一種形式是返回字串字尾或指定位置後面字元。這裡需要給出指定字串及其返回字串的起始位置
。例如,從文字檔案中抽取姓氏,需操作域1,並從第三個字元開始: 
$ awk '{print substr($1, 3)}' grade.txt 
Troll 
Transley 

還有一個例子,在BEGIN部分定義字串,在END部分返回從第t個字元開始抽取的子串。 
$ awk 'BEGIN {STR="A FEW GOOD MEN"} END {print substr(STR,7)}' grade.txt 
GOOD MEN 

測試:

[[email protected] zy]# echo "A FEW GOOD MEN,as follows:"|awk 'BEGIN{STR="A FEW GOOD MEN"} END{print substr(STR,7)}'
GOOD MEN

而如果要是單獨輸入awk 'BEGIN{STR="A FEW GOOD MEN"} END{print substr(STR,7)}',它就會卡到那裡~

8.從shell中向awk傳入字串 
awk指令碼大多隻有一行,其中很少是字串表示的,這一點通過將變數傳入awk命令列會變得很容易。現就其基本原
理講述一些例子。
使用管道將字串stand-by傳入awk,返回其長度。 
$ echo "Stand-by" | awk '{print length($0)}' 


設定檔名為一變數,管道輸出到awk,返回不帶副檔名的檔名。 
$ STR="mydoc.txt"

$ echo $STR | awk '{print substr($STR, 1, 5)}' 

mydoc 

設定檔名為一變數,管道輸出到awk,只返回其副檔名。 
$ STR="mydoc.txt" 

$ echo $STR | awk '{print substr($STR, 7)}'

 txt

相關推薦

**awk函式小節**

awk提供了許多強大的字串函式,見下表:  awk內建字串函式  gsub(r,s) 在整個$0中用s替代r  gsub(r,s,t) 在整個t中用s替代r index(s,t) 返回s中字串t的第一位置  length(s) 返回s長度match(s,r) 測試s是否包含

awk 函式詳解

本文承接上篇 linux awk 內建變數,本篇總結下awk內建函式。awk內建函式主機分為如下幾種:數學函式、字串函式、時間函式、其它函式。 一、數學函式 以下算術函式執行與 C 語言中名稱相同的子例程相同的操作: 函式名 說明 atan2( y, x )

linux awk 函式詳細介紹(例項)

這節詳細介紹awk內建函式,主要分以下3種類似:算數函式、字串函式、其它一般函式、時間函式 一、算術函式: 以下算術函式執行與 C 語言中名稱相同的子例程相同的操作: 函式名 說明 atan2( y, x ) 返回 y/x 的反正切。 cos( x ) 返回 x 的餘弦;x 是弧度。 sin( x ) 返

awk 簡單用法(函式

做為一個windows系統管理員,文字處理將是一個難點,但在linux 裡面顯然就是一盤小白菜.在linux 文字處理工具上面,awk佔了60%的份量,另外還有sed與grep ,這裡主要記錄一些awk常見的使用方法,詳細的大家可以舉一反三, awk 這不是一個單詞,而是這門

awk函式

N gsub(reg,string,target) 每次常規表示式 reg 匹配時替換 target 中的 string N index(search,string) 返回 string 中 search 串的位置 A length(string) 求串 string 中的字元個數 N mat

awk 時間函式

mktime建立指定時間 mktime( YYYY MM DD HH MM SS[ DST]) 注意格式,必須都是空格分割。 echo “2014-03-27 17 26 54,” |aw

函式和常用模組【day04】:函式(十)

一、36-40 36、isinstance(object, classinfo) 功能:用於判斷,物件是否是某個類的例項 # s = "alex" # 物件,"alex" => str s = [11,11,11] # 用於判斷,物件是否是某個類的例項 r = isinsta

python之路-day3-函式

一、 昨日內容回顧   1、生成器     本質就是迭代器     特點:       1、省記憶體       2、惰性機制       3、只能向前  不能反覆   2、生成器函式     函式中的yield 。yield表示返回和return,分段執行一段程式碼     def fun

python D13 函式

# 1、內建函式# 什麼是內建函式? 就是python給你提供的. 拿來直接⽤的函式, 比如print., input等等. 截⽌# 到python版本3.6.2 python⼀共提供了68個內建函式. 他們就是python直接提供給我們的. 有# ⼀些我們已經⽤過了. 有⼀些還沒有⽤過. 還有⼀些需

day12-2018-11-2 函式

lst = ["唐伯虎", "小娟", "張鶴倫", "燒餅"] # it = lst.__iter__() # print(it.__next__()) # print(it.__next__()) # print(it.__next__()) # print(it.__next__())

python學習day15 day16 函式、匿名函式

https://www.processon.com/view/link/5bdc4fe3e4b09ed8b0c75e81 例子: print(locals()) #返回本地作用域中的所有名字 print(globals()) #返回全域性作用域中的所有名字 global 變數 nonlocal

Python全棧學習筆記day 15:函式

全部內建函式列表:     Built-in Functions     abs() dict() help() min()

Python函式map

簡介 map()是 Python 內建的高階函式,它接收一個函式 func 和一個 list,並通過把函式 func依次作用在 list 的每個元素上,得到一個新的 list 並返回。 一、當list只有一個時 當list只有一個時,將函式func作用於這個list的每個元素上

day013函式

一、內建函式一 [內建函式思維導圖連結] (https://www.processon.com/view/link/5bdc5328e4b0844e0bc6c846) 內建函式就是python提供的,拿來直接用的,如print,input等等 1.作用域相關的 locals

day_12 函式

    1. 內建函式 1.雙下劃線方法的使用 1.原來it=lst.__iter__() print(it__next__()) 2.現在it=iter(list) print(next(it)) 2.id() hash()

【轉】Python 函式 locals() 和globals()

Python 內建函式 locals() 和globals() 轉自: https://blog.csdn.net/sxingming/article/details/52061630

MySQL 常用函式與所有函式

MySQL 常用內建函式 【數值函式】 Abs(X) //絕對值abs(-10.9) = 10 Format(X,D) //格式化千分位數值format(1234567.456, 2) =1,234,567.46 Ceil(X) //向上取整ceil(10.1) = 11 Floor(X) //

常用函式

dir:檢視當前物件的可呼叫的函式。 help:檢視當前函式的幫助文件 字串: lower():所有的大寫字母轉換成小寫 upper():所有的小寫字母轉換成大寫 swapcase():大寫變小寫,小寫變大寫 title()

9 幾個函式

一、 bytes()  s = "你好" bs = s.encode("UTF-8") print(bs) s1 = bs.decode("UTF-8") print(s1) bs = bytes(s, encoding="utf-8") # 把字串串編碼成UTF-8 print(b

python day14函式二(lambda,sorted,filter,map,遞迴)

一.lambda匿名函式 為了解決一些簡答的需求而設計的一句話函式.   計算n的n次方 1 def func(n): 2 return n**n 3 print(func(10)) lambda 1 f=lambda n:n**n 2 print(f(10))