首頁 > 軟體

awk 字串與算數處理

2020-06-16 17:23:47

格式化輸出 

   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 testn","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.   +    顯示使用的defg格式的整數時,前面加上正負號(+/-)
  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

 

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-01/139373.htm


IT145.com E-mail:sddin#qq.com