歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

awk 字符串與算數處理

格式化輸出 

   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中較短的一種
  14.    
  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