Sedawk笔记之awk篇:快速了解Awk(三)
生活随笔
收集整理的這篇文章主要介紹了
Sedawk笔记之awk篇:快速了解Awk(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇中,主要介紹了awk中的一些基礎概念,包括記錄與字段、表達式、變量、語句等等,本篇在此基礎上進一步介紹下awk中的函數。 awk的函數分成數學函數、字符串函數、I/O處理函數以及用戶自定義的函數,其中用戶自定義的函數我們在上一篇中也有簡單的介紹,下面我們一一來介紹這幾類函數。
數學函數
awk 中支持以下數學函數:- atan2(y,x):反正切函數;
- cos(x):余弦函數;
- sin(x):正弦函數;
- exp(x):以自然對數e為底指數函數;
- log(x):計算以e 為底的對數值;
- sqrt(x):計算平方根函數;
- int(x):將數值轉換成整數;
- rand():返回0到1的一個隨機數值,不包含1;
- srand([expr]):設置隨機種子,一般與rand函數配合使用,如果參數為空,默認使用當前時間為種子;
字符串函數
awk中包含大多數常見的字符串操作函數。1. sub(ere, repl[, in])
描述:簡單地說,就是將in中匹配ere的部分替換成repl,返回值是替換的次數。如果in參數省略,默認使用$0。替換的動作會直接修改變量的值。 下面是一個簡單的替換的例子: [kodango@devops ~]$ echo "hello, world" | awk '{print sub(/ello/, "i"); print}' 1 hi, world 在repl參數中&是一個元字符,它表示匹配的內容,例如: [kodango@devops ~]$ awk 'BEGIN {var="kodango"; sub(/kodango/, "hello, &", var); print var}' hello, kodango2. gsub(ere, repl[, in])
描述:同sub()函數功能類似,只不過是gsub()是全局替換,即替換所有匹配的內容。3. index(s, t)
描述:返回字符串t在s中出現的位置,注意這里位置是從1開始計算的,如果沒有找到則返回0。 例如: [kodango@devops ~]$ awk 'BEGIN {print index("kodango", "o")}' 2 [kodango@devops ~]$ awk 'BEGIN {print index("kodango", "w")}' 04. length[([s])]
描述:返回字符串的長度,如果參數s沒有指定,則默認使用$0作為參數。 例如: [kodango@devops ~]$ awk 'BEGIN {print length('kodango');}' 0 [kodango@devops ~]$ echo "first line" | awk '{print length();}' 105. match(s, ere)
描述: 返回字符串s匹配ere的起始位置,如果不匹配則返回0。該函數會定義RSTART和RLENGTH兩個內置變量。RSTART與返回值相同,RLENGTH記錄匹配子串的長度,如果不匹配則為-1。 例如: [kodango@devops ~]$ awk 'BEGIN { print match("kodango", /dango/); printf "Matched at: %d, Matched substr length: %d\n", RSTART, RLENGTH; }' 3 Matched at: 3, Matched substr length: 56. split(s, a[, fs])
描述:將字符串按照分隔符fs,分隔成多個部分,并存到數組a中。注意,存放的位置是從第1個數組元素開始的。如果fs為空,則默認使用FS分隔。函數返回值分隔的個數。 例如: [kodango@devops ~]$ awk 'BEGIN { > split("1;2;3;4;5", arr, ";") > for (i in arr) > printf "arr[%d]=%d\n", i, arr[i]; > }' arr[4]=4 arr[5]=5 arr[1]=1 arr[2]=2 arr[3]=3 這里有一個奇怪的地方是for..in..輸出的數組不是按順序輸出的,如果要按順序輸出可以用常規的for循環: [kodango@devops ~]$ awk 'BEGIN { > split("1;2;3;4;5", arr, ";") > for (i=0;^C [kodango@devops ~]$ awk 'BEGIN { > n=split("1;2;3;4;5", arr, ";") > for (i=1; i<=n; i++) > printf "arr[%d]=%d\n", i, arr[i]; > }' arr[1]=1 arr[2]=2 arr[3]=3 arr[4]=4 arr[5]=57. sprintf(fmt, expr, expr, ...)
描述:類似printf,只不過不會將格式化后的內容輸出到標準輸出,而是當作返回值返回。 例如: [kodango@devops ~]$ awk 'BEGIN { > var=sprintf("%s=%s", "name", "value") > print var > }' name=value8. substr(s, m[, n])
描述:返回從位置m開始的,長度為n的子串,其中位置從1開始計算,如果未指定n或者n值大于剩余的字符個數,則子串一直到字符串末尾為止。 例如: [kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2, 3); }' oda [kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2); }' odango9. tolower(s)
描述:將字符串轉換成小寫字符。 例如: [kodango@devops ~]$ awk 'BEGIN {print tolower("KODANGO");}' kodango10. toupper(s)
描述:將字符串轉換成大寫字符。 例如 [kodango@devops ~]$ awk 'BEGIN {print tolower("kodango");}' KODANGOI/O處理函數
1. getline
getline的用法相對比較復雜,它有幾種不同的形式。不過它的主要作用就是從輸入中每次獲取一行輸入。 a. expression | getline [var] 這種形式將前面管道前命令輸出的結果作為getline的輸入,每次讀取一行。如果后面跟有var,則將讀取的內容保存到var變量中,否則會重新設置$0和NF。 例如,我們將上面的statement.txt文件的內容顯示作為getline的輸入: [kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline var) print var}' statement delete exit next 上面的例子中命令要用雙引號,"cat statement.txt",這一點同print/printf是一樣的。 如果不加var,則直接寫到$0中,注意NF值也會被更新: [kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline) print $0,NF}' statement 1 delete 1 exit 1 next 1 b. getline [var] 第二種形式是直接使用getline,它會從處理的文件中讀取輸入。同樣地,如果var沒有,則會設置$0,并且這時候會更新 NF, NR和FNR: [kodango@devops awk_temp]$ awk '{ > while (getline) > print NF, NR, FNR, $0; > }' statement.txt 1 2 2 delete 1 3 3 exit 1 4 4 next c. getline [var] < expression 第三種形式從expression中重定向輸入,與第一種方法類似,這里就不加贅述了。2. close
close函數可以用于關閉已經打開的文件或者管道,例如getline函數的第一種形式用到管道,我們可以用close函數把這個管道關閉,close函數的參數與管道的命令一致: [kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline) {print $0;close("cat statement.txt"); }}' statement statement statement statement statement 但是每次讀了一行后,關閉管道,然后重新打開又重新讀取第一行就死循環了。所以要慎用,一般情況下也很少會用到close函數。3. system
這個函數很簡單,就是用于執行外部命令,例如: [kodango@devops awk_temp]$ awk 'BEGIN {system("uname -r");}' 3.6.2-1-ARCH結束語
快速了解Awk系列的幾篇文章相對比較粗糙,我是參考Awk的man手冊以及《Sed & wk》附錄B總結而成的,但是應該可以讓大家對awk有一個大致的了解,歡迎大家一起交流。 附Peteris Krumins在他博客上發布的一份cheet sheet:awk cheat sheet (.pdf) 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Sedawk笔记之awk篇:快速了解Awk(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb创建用户和密码
- 下一篇: ubuntu创建wifi热点plasma