歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> awk 字符串與算數處理

awk 字符串與算數處理

日期:2017/2/28 13:44:50   编辑:Linux教程

格式化輸出

awk提供兩個高級輸出函數printfsprintf,他們提供了格式化輸出功能。 - printf函數將格式化字符串打印到標准輸出(stdout) - sprintf 函數則返回“可以賦值給變量的字符串” eg. print.awk
  1. # printf & sprintf
  2. {
  3. # 第一個字段
  4. x = $1
  5. b ="foo"
  6. # 格式化輸出
  7. printf("%s got a %d on last test\n","Jim",83)
  8. # 將格式化的字符串賦給變量
  9. myout = sprintf("%s - %d", b, x)
  10. # 簡單輸出,自帶換行
  11. print myout
  12. }

  1. echo 100| awk -f print.awk
  2. Jim got a 83 on last test foo - 100
格式化輸出支持的轉義字符(格式說明符)
  1. c ACII字符(char型)
  2. s 字符串
  3. d 十進制整數
  4. ld 十進制長整形
  5. u 十進制無符號整數
  6. lu 十進制無符號長整數
  7. x 十六進制整數
  8. lx 十六進制長整數
  9. o 八進制整數
  10. lo 八進制長整數
  11. e 用科學計數法表示的浮點數
  12. f 浮點數
  13. g 選e/f中較短的一種
awk還支持一些修飾符,這些修飾符跟在‘%’後面,出現在格式說明符之前,可以規定輸出域的寬度和對齊方式。 printf的修飾符
  1. - 左對齊修飾符
  2. # 顯示8進制數時在前面加個0;16進制數時在前面加個0x
  3. + 顯示使用的d、e、f、g格式的整數時,前面加上正負號(+/-)
  4. 0 用0而不是空白來填充所顯示的值
格式說明符和修飾符的使用方法: %-width.precision format-specifier eg. %10s // 默認右對齊; 10:輸出字段的域長度至少10個字符,不夠10個,空白補齊;多余10個時,原樣輸出 %-10s // 同上,- 表示輸出左對齊 %10.5f // 字段輸出至少10個字符寬度;5-小數點後5位 字符串函數
1. 子字符串查找 index(str,subsr) 返回子串subsr在串str中第一次出現的索引(起始位置),index函數字符串的開始位置為1.(C語言為0) 2. 子字符串提取 substr(str,position[,length]) 返回str中position位置開始的length個字符;缺省length時,返回positio位置開始的所有字符。 eg. awk '{print substr($1,3)}' // 提取第一個域中從第三個字符起的所有字符 awk '{print substr($1,5,9)}' // 提取第一個域中從第5個字符起的後面9個字符 3. 字符串匹配 match(string,/regexp/) 如果在string中找到匹配正則/regexp/的子字符串,則返回子字符串的起始位置,無法匹配,則返回0 區別: index()函數查找固定字符串的位置,match()支持正則匹配! match()函數會影響兩個系統變量: RSTART :運行match()後,被設置為匹配上正則表達式的子字符串的起始位置。 RLENGTH:運行match()後,被設置為匹配上正則表達式的子字符串的長度。 若無法匹配,RSTART被設置為0,RLENGTH被設置為-1。 4. 子字符串替換 sub(regexp,replacement,target) 將target與正則表達式regrxp進行匹配,只替換匹配到的第一個字符串;如果target沒有給定,則sub函數默認使用整個記錄。 gsub(regexp,replacement,target) // gsub()函數替換所有匹配到的字符串 5.大小寫轉換 tolower(string) 將輸入文本轉為小寫 toupper(string) 將輸入文本轉為大寫 6. 字符串分割 split(string,array,regexp)字符串分割函數 將string切割為片段,並存儲到數組裡,分割字符串時的分隔符由正則regexp指定,省略regexp時默認為FS(空格). eg.1
  1. [root@web1 test]# cat split.awk
  2. # awk 字符串分隔函數
  3. {
  4. print "\nField seperator = FS \" "FS" \""
  5. n = split($0, array) // 默認使用 空格 為字段分隔符
  6. for(k =1; k <= n; k++) // split函數返回分割後的字符串的個數
  7. {
  8. print "array[k] = " array[k]
  9. }
  10. }
  1. [root@web1 test]# echo "dfssfs sdf dsf dsf "| awk -f split.awk
  2. Field seperator = FS " "
  3. array[k]= dfssfs
  4. array[k]= sdf
  5. array[k]= dsf
  6. array[k]= dsf
eg.2
  1. [root@web1 test]# cat split.awk
  2. # awk 字符串分隔函數
  3. {
  4. print "\nField seperator = :"
  5. n = split($0, array,":") // 指定分隔符為 ":"
  6. for(k =1; k <= n; k++)
  7. {
  8. print "array[k] = " array[k]
  9. }
  10. }
  1. [root@web1 test]# head -n2 /etc/passwd | awk -f split.awk
  2. Field seperator =:
  3. array[k]= root
  4. array[k]= x
  5. array[k]=0
  6. array[k]=0
  7. array[k]= root
  8. array[k]=/root
  9. array[k]=/bin/bash
  10. Field seperator =:
  11. array[k]= bin
  12. array[k]= x
  13. array[k]=1
  14. array[k]=1
  15. array[k]= bin
  16. array[k]=/bin
  17. array[k]=/sbin/nologin
split("",array) // 快速清空數組 7. 字符串重建 eg.1
  1. [root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = s1 s2 ; print s}'
  2. hello ollir
  1. [root@web1 test]# awk 'BEGIN{ s1 = "hello "; s2 = "ollir "; s = sprintf("%s%s",s1 ,s2); print s}'
  2. hello ollir
算術函數 1.常用函數 三角函數sin()、cos() // 輸入參數為弧度角,不是30°之類的角度,要轉化為弧度 atan(x,y) // x,y范圍內的余切 exp(x) // 以e為底數的指數 log() // 自然對數 sqrt() // 平方根 2.取整函數 int() 取實型數字的整數部分,直接忽略小數部分 eg.
  1. print int(10.6)
  2. 10
3.隨機數 rand() 生成一個0-1之間的浮點型隨機數 srand(x)為隨機數發生器設置一個種子,種子數值為x,如果x未傳入參數,則srand()函數將當前時間作為種子。 如果沒有調用srand()來設置隨機種子的話,awk在開始執行程序前默認以某個常量作為參數調用srand(),使得程序每次運行時都以同一個隨機種子開始,這樣使得所得的隨機數序列每次運行都相同,這可以用於重復測試相同的操作。 eg.
  1. [root@web1 test]# cat rand.awk
  2. BEGIN {
  3. # 沒有顯式調用srand()設置種子,awk使用默認常量作為參數傳入srand()設置固定的種子
  4. print rand() // 隨機數固定
  5. print rand()
  6. # srand()使用當前時間作為參數上設置種子
  7. srand()
  8. print rand() //隨機數與當前時間有關
  9. print rand()
  10. }
  11. {}
  12. [root@web1 test]# echo ""| awk -f rand.awk
  13. 0.237788
  14. 0.291066
  15. 0.0421086
  16. 0.447394
  17. [root@web1 test]# echo ""| awk -f rand.awk
  18. 0.237788
  19. 0.291066
  20. 0.874176
  21. 0.562551

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系統之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文本處理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入門基礎教程 http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化輸出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm

Copyright © Linux教程網 All Rights Reserved