系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux使用文本處理工具awk

Linux如何使用文本處理工具awk

時間:2015-01-14 18:22:52 作者:qipeng 來源:系統(tǒng)之家 1. 掃描二維碼隨時看資訊 2. 請使用手機瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150114/34882.html 手機查看 評論

  awk是Linux中的文本處理工具,類似于shell編程語言,擁有屬于自己的語言,下面小編就給大家介紹下Linux中awk文本處理工具的用法,感興趣的朋友可以來了解一下。

 Linux如何使用文本處理工具awk
 

  調用方式

  1.命令行

  awk [-F field-separator] ‘commands’ input-file(s)

  commands是真正awk命令,[-F域分隔符]是可選的。input-file(s) 是待處理的文件。在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格(或者tab)。

  2.shell腳本方式

  將所有的awk命令插入一個文件,并使awk程序可執(zhí)行,然后awk命令解釋器作為腳本的首行,以便通過鍵入腳本名稱來調用。相當于shell腳本首行的:#!/bin/sh 可以換成:#!/bin/awk -f

  3.將所有的awk命令插入一個單獨文件,然后調用:awk -f awk-script-file input-file(s)其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。

  內(nèi)置變量

  ARGC:命令行參數(shù)個數(shù)

  ARGV:命令行參數(shù)排列

  ENVIRON:UNIX環(huán)境變量

  ERRNO:UNIX系統(tǒng)錯誤消息

  FILENAME:awk瀏覽的文件名

  OFMT:數(shù)字的輸出格式 %.6g

  FNR:瀏覽文件的記錄數(shù)

  FS:設置輸入域分隔符,等價于命令行 -F選項

  NF:瀏覽記錄的域的個數(shù)

  NR:已讀的記錄數(shù),就是行號,從1開始

  FNR:當前記錄數(shù)

  OFS:輸出域分隔符

  ORS:輸出記錄分隔符

  RS:控制記錄分隔符

  $0:當前記錄(作為單個變量)

  $1~$n:當前記錄的第n個字段,字段間由FS分隔

  輸出函數(shù)

  print:參數(shù)可以是變量、數(shù)值或者字符串。字符串必須用雙引號引用,參數(shù)用逗號分隔。如果沒有逗號,參數(shù)就串聯(lián)在一起而無法區(qū)分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已

  printf:其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。具體格式如下:

  %d 十進制有符號整數(shù)

  %u 十進制無符號整數(shù)

  %f 浮點數(shù)

  %s 字符串

  %c 單個字符

  %p 指針的值

  %e 指數(shù)形式的浮點數(shù)

  %x %X 無符號以十六進制表示的整數(shù)

  %o 無符號以八進制表示的整數(shù)

  %g 自動選擇合適的表示法

  獲取外部變量

  1.獲取普通外部變量

  awk ‘{action}’ 變量名=變量值

  2.BEGIN程序塊中變量

  awk –v 變量名=變量值 [–v 變量2=值2 …] ‘BEGIN{action}’

  3.環(huán)境變量

  需要用到內(nèi)置變量ENVIRON實現(xiàn)

  運算符

  1.賦值運算符

  = += -= *= /= %= ^= **=

  2.邏輯運算符

  ||:邏輯或

  &&:邏輯與

  3.正則運算符

  ~:匹配正則表達式

  ~。翰黄ヅ湔齽t表達式

  4.關系運算符

  《 《= 》 》= != ==

  5.算術運算符

  + - * / & ++ --

  6.其它運算符

  $:字段引用

  空格:字符串連接符

  ?:C條件表達式

  in:數(shù)組中是否存在某鍵值

  字符操作

  1.字符串轉數(shù)字

  將變量通過”+”連接運算。自動強制將字符串轉為整型。非數(shù)字變成0,發(fā)現(xiàn)第一個非數(shù)字字符,后面自動忽略

  2.數(shù)字轉字符串

  只需要將變量與””符號連接起來運算即可

  3.字符串連接

  只需要將變量與””符號連接起來運算即可

  數(shù)組操作

  在awk中數(shù)組叫做關聯(lián)數(shù)組,因為下標既可以是數(shù)也可以是串。awk中的數(shù)組不必提前聲明,也不必聲明大小。數(shù)組元素用0或空串來初始化,這根據(jù)上下文而定。需要注意的是不同版本下面函數(shù)不一定相同。其相關的函數(shù)有l(wèi)ength、asort、delete、split。當然也可以實現(xiàn)多維數(shù)組。

  流程控制語句

  1.條件判斷語句(if)

  if(表達式){語句1}else{語句2}

  if(表達式){語句1}else if(表達式){語句2}else{語句3}

  2.循環(huán)語句(while、for、do while)

  while(表達式){語句}

  for(變量 in 數(shù)組){語句}

  for(變量;條件;表達式){語句}

  do{語句}while(條件)

  3.關鍵字

  break:當break語句用于while或for語句時,導致退出程序循環(huán)。

  continue:當continue語句用于while或for語句時,使程序循環(huán)移動到下一個迭代。

  next:能能夠導致讀入下一個輸入行,并返回到腳本的頂部。這可以避免對當前輸入行執(zhí)行其他的操作過程。

  exit:語句使主輸入循環(huán)退出并將控制轉移到END,如果END存在的話。如果沒有定義END規(guī)則,或在END中應用exit語句,則終止腳本的執(zhí)行。

  正則表達式

  +:包含一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行:awk ’/smith+ern/‘ testfile

 。浚喊銈或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行:awk ’/smith?/‘ testfile

  |:以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行:awk ’/allen | alan /‘ testfile

 。ǎ涸谡齽t表達式中將字符串組合在一起。命令行:awk ’/a(ll)?/‘ testfile

  {m}:有m個模式的具體值位于字符串中,則字符串匹配。命令行:awk ’/l{2}/‘ testfile

  {m,}:至少m個模式的具體值在字符串中,則字符串匹配。命令行:awk ’/t{2,}/‘ testfile

  {m, n}:在m和n之間(包含的m和n)個模式的具體值在字符串中(其中m 《= n),則字符串匹配。命令行:awk ’/er{1, 2}/‘ testfile

 。跾tring]:正則表達式與方括號內(nèi)String變量指定的任何字符匹配。命令行:awk ’/sm[a-h]/‘ testfile

 。踍 String]:在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內(nèi)的任何字符不匹配。這樣,命令行:awk ’/sm[^a-h]/‘ testfile

  ~,!~:表示指定變量與正則表達式匹配或不匹配的條件語句。命令行:awk ’$1 ~ /n/‘ testfile

  ^:指定字段或記錄的開頭。命令行:awk ’$2 ~ /^h/‘ testfile

  $:指定字段或記錄的末尾。命令行:awk ’$2 ~ /y$/‘ testfile

  。:表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行:awk ’/a..e/‘ testfile

  \ :轉義字符。當位于在擴展正則表達式中具有特殊含義的任何字符之前時,轉義字符除去該字符的任何特殊含義。例如,命令行:/a\/\//

  內(nèi)置函數(shù)

  1.算術函數(shù)

  atan2( y, x ) 返回 y/x 的反正切。

  cos( x ) 返回 x 的余弦;x 是弧度。

  sin( x ) 返回 x 的正弦;x 是弧度。

  exp( x ) 返回 x 冪函數(shù)。

  log( x ) 返回 x 的自然對數(shù)。

  sqrt( x ) 返回 x 平方根。

  int( x ) 返回 x 的截斷至整數(shù)的值。

  rand( ) 返回任意數(shù)字 n,其中 0 《= n 《 1。

  srand( [Expr] ) 將 rand 函數(shù)的種子值設置為 Expr 參數(shù)的值,或如果省略 Expr 參數(shù)則使用某天的時間。返回先前的種子值。

  2.字符串函數(shù)

  gsub( Ere, Repl, [ In ] ) 除了正則表達式所有具體值被替代這點,它和 sub 函數(shù)完全一樣地執(zhí)行,。

  sub( Ere, Repl, [ In ] ) 用 Repl 參數(shù)指定的字符串替換 In 參數(shù)指定的字符串中的由 Ere 參數(shù)指定的擴展正則表達式的第一個具體值。sub 函數(shù)返回替換的數(shù)量。出現(xiàn)在 Repl 參數(shù)指定的字符串中的 &(和符號)由 In 參數(shù)指定的與 Ere 參數(shù)的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數(shù),缺省值是整個記錄($0 記錄變量)。

  index( String1, String2 ) 在由 String1 參數(shù)指定的字符串(其中有出現(xiàn) String2 指定的參數(shù))中,返回位置,從 1 開始編號。如果 String2 參數(shù)不在 String1 參數(shù)中出現(xiàn),則返回 0(零)。

  length [(String)] 返回 String 參數(shù)指定的字符串的長度(字符形式)。如果未給出 String 參數(shù),則返回整個記錄的長度($0 記錄變量)。

  blength [(String)] 返回 String 參數(shù)指定的字符串的長度(以字節(jié)為單位)。如果未給出 String 參數(shù),則返回整個記錄的長度($0 記錄變量)。

  substr( String, M, [ N ] ) 返回具有 N 參數(shù)指定的字符數(shù)量子串。子串從 String 參數(shù)指定的字符串取得,其字符以 M 參數(shù)指定的位置開始。M 參數(shù)指定為將 String 參數(shù)中的第一個字符作為編號 1。如果未指定 N 參數(shù),則子串的長度將是 M 參數(shù)指定的位置到 String 參數(shù)的末尾 的長度。

  match( String, Ere ) 在 String 參數(shù)指定的字符串(Ere 參數(shù)指定的擴展正則表達式出現(xiàn)在其中)中返回位置(字符形式),從 1 開始編號,或如果 Ere 參數(shù)不出現(xiàn),則返回 0(零)。RSTART 特殊變量設置為返回值。RLENGTH 特殊變量設置為匹配的字符串的長度,或如果未找到任何匹配,則設置為 -1(負一)。

  split( String, A, [Ere] ) 將 String 參數(shù)指定的參數(shù)分割為數(shù)組元素 A[1], A[2], 。 。 。, A[n],并返回 n 變量的值。此分隔可以通過 Ere 參數(shù)指定的擴展正則表達式進行,或用當前字段分隔符(FS 特殊變量)來進行(如果沒有給出 Ere 參數(shù))。除非上下文指明特定的元素還應具有一個數(shù)字值,否則 A 數(shù)組中的元素用字符串值來創(chuàng)建。

  tolower( String ) 返回 String 參數(shù)指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當前語言環(huán)境的 LC_CTYPE 范疇定義。

  toupper( String ) 返回 String 參數(shù)指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當前語言環(huán)境的 LC_CTYPE 范疇定義。

  sprintf(Format, Expr, Expr, 。 。 。 ) 根據(jù) Format 參數(shù)指定的 printf 子例程格式字符串來格式化 Expr 參數(shù)指定的表達式并返回最后生成的字符串。

  3.時間函數(shù)

  mktime( YYYY MM DD HH MM SS[ DST]) 生成時間格式

  strftime([format [, timestamp]]) 格式化時間輸出,將時間戳轉為時間字符串,具體格式如下:

  %a 星期幾的縮寫(Sun)

  %A 星期幾的完整寫法(Sunday)

  %b 月名的縮寫(Oct)

  %B 月名的完整寫法(October)

  %c 本地日期和時間

  %d 十進制日期

  %D 日期 08/20/99

  %e 日期,如果只有一位會補上一個空格

  %H 用十進制表示24小時格式的小時

  %I 用十進制表示12小時格式的小時

  %j 從1月1日起一年中的第幾天

  %m 十進制表示的月份

  %M 十進制表示的分鐘

  %p 12小時表示法(AM/PM)

  %S 十進制表示的秒

  %U 十進制表示的一年中的第幾個星期(星期天作為一個星期的開始)

  %w 十進制表示的星期幾(星期天是0)

  %W 十進制表示的一年中的第幾個星期(星期一作為一個星期的開始)

  %x 重新設置本地日期(08/20/99)

  %X 重新設置本地時間(12:00:00)

  %y 兩位數(shù)字表示的年(99)

  %Y 當前月份

  %Z 時區(qū)(PDT)

  %% 百分號(%)

  systime() 得到時間戳,返回從1970年1月1日開始到當前時間(不計閏年)的整秒數(shù)

  4.其他函數(shù)

  close( Expression ) 用同一個帶字符串值的 Expression 參數(shù)來關閉由 print 或 printf 語句打開的或調用 getline 函數(shù)打開的文件或管道。如果文件或管道成功關閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,并稍后在同一個程序中讀取文件,則 close 語句是必需的。

  system(Command ) 執(zhí)行 Command 參數(shù)指定的命令,并返回退出狀態(tài)。等同于 system 子例程。

  Expression | getline [ Variable ] 從來自 Expression 參數(shù)指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,并將該記錄的值指定給 Variable 參數(shù)指定的變量。如果當前未打開將 Expression 參數(shù)的值作為其命令名稱的流,則創(chuàng)建流。創(chuàng)建的流等同于調用 popen 子例程,此時 Command 參數(shù)取 Expression 參數(shù)的值且 Mode 參數(shù)設置為一個是 r 的值。只要流保留打開且 Expression 參數(shù)求得同一個字符串,則對 getline 函數(shù)的每次后續(xù)調用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。

  getline [ Variable ] 《 Expression 從 Expression 參數(shù)指定的文件讀取輸入的下一個記錄,并將 Variable 參數(shù)指定的變量設置為該記錄的值。只要流保留打開且 Expression 參數(shù)對同一個字符串求值,則對 getline 函數(shù)的每次后續(xù)調用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。

  getline [ Variable ] 將 Variable 參數(shù)指定的變量設置為從當前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量設置為該記錄的值,還將設置 NF、NR 和 FNR 特殊變量。

  5.排序函數(shù)

  asort:對數(shù)組的值進行排序,并且會丟掉原先鍵值;

  asorti:對數(shù)組的下標進行排序。

  例如

  1.內(nèi)置變量

  a.$0

  awk ’/^root/{print $0}‘ /etc/passwd #/^root/為選擇表達式,$0代表是逐行

  b.設置字段分隔符號(FS)

  awk ’BEGIN {FS=“:”} /^root/ {print $1, NF}‘ /etc/passwd #FS為字段分隔符,可以自己設置,默認是空格,因為passwd里面是”:”分隔,所以需要修改默認分隔符。NF是字段總數(shù),$0代表當前行記錄,$1-$n是當前行,各個字段對應值。

  c.記錄條數(shù)(NR、FNR)

  awk ’BEGIN {FS=“:”} {print NR, $1, FNR}‘ /etc/passwd #NR得到當前記錄所在行

  d.設置輸出字段分隔符(OFS)

  awk ’BEGIN {FS=“:”; OFS=“~~”} /^root/ {print FNR, $1, $NF}‘ /etc/passwd #OFS設置默認字段分隔符

  e.設置輸出行記錄分隔符(ORS)

  awk ’BEGIN {FS=“:”; ORS=“~~”} {print FNR, $1, $NF}‘ #ORS默認是換行符,這里修改為:”~~”,所有行之間用”~~”分隔了

  f.輸入?yún)?shù)獲。ˋRGC,ARGV)

  awk ’BEGIN {FS=“:”; print “ARGC=”ARGC; for (k in ARGV) {print k“=”ARGV[k];}}‘ /etc/passwd #ARGC得到所有輸入?yún)?shù)個數(shù),ARGV獲得輸入?yún)?shù)內(nèi)容,是一個數(shù)組

  g.獲得傳入的文件名(FILENAME)

  awk ’BEGIN {FS=“:”; print FILENAME} {print FILENAME}‘ /etc/passwd #FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能獲得任何與文件記錄操作的變量。

  h.獲得linux環(huán)境變量(ENVIRON)

  awk ’BEGIN {print ENVIRON[“PATH”];}‘ /etc/passwd #ENVIRON是子典型數(shù)組,可以通過對應鍵值獲得它的值。

  i.輸出數(shù)據(jù)格式設置(OFMT)

  awk ’BEGIN {OFMT=“%.3f”; print 2/3,123.11111111;}‘ /etc/passwd #OFMT默認輸出格式是:%.6g 保留六位小數(shù),這里修改OFMT會修改默認數(shù)據(jù)輸出格式

  j.按寬度指定分隔符

  echo 20100117054932 | awk ’BEGIN {FIELDWIDTHS=“4 2 2 2 2 3”} {print $1“-”$2“-”$3,$4“:”$5“:”$6}‘ #FIELDWIDTHS其格式為空格分隔的一串數(shù)字,用以對記錄進行域的分隔,F(xiàn)IELDWIDTHS=“4 2 2 2 2 2”就表示$1寬度是4,$2是2,$3是2 。。.。 。這個時候會忽略:FS分隔符

  k.RSTART RLENGTH

  awk ’BEGIN{start=match(“this is a test”,/[a-z]+$/); print start, RSTART, RLENGTH }‘

  awk ’BEGIN{start=match(“this is a test”,/^[a-z]+$/); print start, RSTART, RLENGTH }‘ #RSTART被匹配正則表達式首位置,RLENGTH匹配字符長度,沒有找到為-1.

  2.獲取外部變量

  a.獲取普通的外部變量

  test=’awk code‘

  echo | awk ’{print test}‘ test=“$test”

  echo | wawk ’BEGIN {print test}‘ test=“$test” #傳入的變量可以在action中獲取值,但是變量名與值放到’{action}‘后邊。其中BEGIN的action是不能獲得

  b.BEGIN程序塊的變量

  test=’awk code‘

  echo | awk -v test=“$test” ’BEGIN {print test}‘

  echo | awk -v test=“$test” ’{print test}‘ #用-v 傳入變量可以在3中類型的action 中都可以獲得到,但順序在 action前面

  c.獲得環(huán)境變量

  awk ’BEGIN {for (i in ENVIRON) {print i“=”ENVIRON[i];}}‘

  3.運算符

  a.賦值運算符、算術運算

  echo | awk ’BEGIN {a=1; b=5; c=3} {a+=5; b++; c--} END {print a, b, c, a*b}‘

  b.邏輯運算符

  awk ’BEGIN {a=1; b=2; print (a》5 && b《=2),(a》5 || b《=2);}‘

  c.關系運算符

  awk ’BEGIN{a=“11”;if(a 》= 9){print “ok”;}}‘ #》 《 可以作為字符串比較,也可以用作數(shù)值比較,關鍵看操作數(shù)如果是字符串 就會轉換為字符串比較。兩個都為數(shù)字 才轉為數(shù)值比較。字符串比較:按照ascii碼順序比較

  d.其它運算符

  awk ’BEGIN {a=“b”; print a==“b” ? “ok” : “err”;}‘ #三目運算

  awk ’BEGIN {a=“b”; arr[0]=“b”; arr[1]=“c”; print (a in arr);}‘ #判斷數(shù)組中是否存在該鍵值

  3.字符操作

  a.字符串轉數(shù)字

  awk ’BEGIN {a=“100”; b=“10test10”; print (a+b+0);}‘

  awk ’BEGIN {a=“100”; b=“10test10”; print a+b+0;}‘

  b.數(shù)字轉字符串

  awk ’BEGIN {a=100; b=100; c=(a“”b); print c}‘

  awk ’BEGIN {a=100; b=100; c=a“”b; print c}‘

  c.字符串連接

  awk ’BEGIN {a=“a”; b=“b”; c=a“”b; print c}‘

  3.數(shù)組操作

  a.賦值

  awk ’BEGIN {tB[“a”]=“a1”; tB[“b”]=1;}‘

  b.數(shù)組長度(length)

  awk ’BEGIN {tB[“a”]=“a1”; tB[“b”]=1; print length(tB)}‘

  awk ’BEGIN {info=“it is a test”; split(info,tA,“ ”); print asort(tA);}‘ #asort對數(shù)組進行排序,返回數(shù)組長度

  c.字符串分割為數(shù)組(split)

  awk ’BEGIN {info=“it is a test”; lens=split(info,tA,“ ”); print length(tA), lens;}‘ #length返回字符串以及數(shù)組長度,split進行分割字符串為數(shù)組,也會返回分割得到數(shù)組長度

  d.數(shù)組輸出

  awk ’BEGIN {info=“it is a test”; split(info,tA,“ ”); for(k in tA){print k, tA[k];}}‘ #for…in 輸出,因為數(shù)組是關聯(lián)數(shù)組,默認是無序的。

  awk ’BEGIN {info=“it is a test”; tlen=split(info,tA,“ ”); for(k=1; k《=tlen; k++){print k, tA[k];}}‘ #如果需要得到有序數(shù)組,需要通過下標獲得。數(shù)組下標是從1開始,與c數(shù)組不一樣

  e.判斷鍵值是否存在

  awk ’BEGIN {tB[“a”]=“a1”; tB[“b”]=“b1”; if(tB[“c”]!=“1”){print “no found”;}; for(k in tB){print k,tB[k];}}‘ #tB[“c”]沒有定義,但是循環(huán)時候,發(fā)現(xiàn)已經(jīng)存在該鍵值,它的值為空,這里需要注意,awk數(shù)組是關聯(lián)數(shù)組,只要通過數(shù)組引用它的key,就會自動創(chuàng)建改序列

  awk ’BEGIN {tB[“a”]=“a1”; tB[“b”]=“b1”; if( “c” in tB){print “ok”;}; for(k in tB){print k,tB[k];}}‘ #if(key in array) 通過這種方法判斷數(shù)組中是否包含”key”鍵值,才能正確的判斷

  f.刪除鍵值

  awk ’BEGIN {tB[“a”]=“a1”; tB[“b”]=“b1”; delete tB[“a”]; for(k in tB){print k, tB[k];}}‘

  g.二維數(shù)組

  awk ’BEGIN{

  for(i=1;i《=9;i++)

  {

  for(j=1;j《=9;j++)

  {

  tarr[i,j]=i*j;

  print i,“*”,j,“=”,tarr[i,j];

  }

  }

  }‘

  #array[k,k2]引用獲得數(shù)組內(nèi)容

  4.流程控制操作

  a.awk ’BEGIN{

  score=100;

  if(score》90)

  {

  print “優(yōu)秀”;

  }

  else if(score》80)

  {

  print “良好”;

  }

  else if(score》70)

  {

  print “普通”;

  }

  else if(score》60)

  {

  print “及格”;

  }else

  {

  print “不及格”;

  }

  }‘

  b.awk ’BEGIN{

  total=0;

  while(i《=100)

  {

  total+=i;

  i++;

  }

  print total;

  }‘

  c.awk ’BEGIN{

  for(k in ENVIRON)

  {

  print k“=”ENVIRON[k];

  }

  }‘ #ENVIRON是awk常量,是數(shù)組

  d.awk ’BEGIN{

  total=0;

  for(i=0;i《=100;i++)

  {

  total+=i;

  }

  print total;

  }‘

  e.awk ’BEGIN{

  total=0;

  i=0;

  do

  {

  total+=i;

  i++;

  }while(i《=100)

  print total;

  }‘

  5.內(nèi)置函數(shù)

  a.算術函數(shù)

  awk ’BEGIN{OFMT=“%.3f”;fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}‘ #OFMT 設置輸出數(shù)據(jù)格式是保留3位小數(shù)

  awk ’BEGIN{srand();fr=int(100*rand());print fr;}‘ #獲得隨機數(shù)

  b.字符串函數(shù)

  awk ’BEGIN{info=“this is a test2010test!”;gsub(/[0-9]+/,“!”,info);print info}‘ #在 info中查找滿足正則表達式,/[0-9]+/ 用””替換,并且替換后的值,賦值給info 未給info值,默認是$0

  awk ’BEGIN{info=“this is a test2010test!”;print index(info,“test”)?“ok”:“no found”;}‘

  awk ’BEGIN{info=“this is a test2010test!”;print match(info,/[0-9]+/)?“ok”:“no found”;}‘ #正則匹配

  awk ’BEGIN{info=“this is a test2010test!”;print substr(info,4,10);}‘ #從第 4個 字符開始,截取10個長度字符串

  awk ’BEGIN{info=“this is a test”;split(info,tA,“ ”);print length(tA);for(k in tA){print k,tA[k];}}‘ #分割info,動態(tài)創(chuàng)建數(shù)組tA

  c.時間函數(shù)

  awk ’BEGIN{tstamp=mktime(“2001 01 01 12 12 12”);print strftime(“%c”,tstamp);}‘

  awk ’BEGIN{tstamp1=mktime(“2001 01 01 12 12 12”);tstamp2=mktime(“2001 02 01 0 0 0”);print tstamp2-tstamp1;}‘ #求2個時間段中間時間差

  d.其他函數(shù)

  awk ’BEGIN{while(“cat /etc/passwd”|getline){print $0;};close(“/etc/passwd”);}‘ #打開外部文件

  awk ’BEGIN{while(getline 《 “/etc/passwd”){print $0;};close(“/etc/passwd”);}‘ #逐行讀取外部文件

  awk ’BEGIN{print “Enter your name:”;getline name;print name;}‘

  awk ’BEGIN{b=system(“ls -al”);print b;}‘ #調用外部應用程序

  6.輸出函數(shù)

  a.printf

  awk ’BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf(“%.2f,%.2u,%.2g,%X,%o\n”,n1,n2,n3,n1,n1);}‘ #類似于C語音

  7.awk腳本

  #!/bin/awk -f

  BEGIN{

  for(i=1;i《=9;i++)

  {

  for(j=1;j《=9;j++)

  {

  tarr[i,j]=i*j;

  print i,“*”,j,“=”,tarr[i,j];

  }

  }

  }

  注意

  1.在awk中有兩個特別的表達式,BEGIN和END,這兩者都可用于pattern中,提供BEGIN和END的作用是給程序賦予初始狀態(tài)和程序結束之后執(zhí)行一些掃尾的工作。任何在BEGIN之后列出的操作(在{}內(nèi))將在awk開始掃描輸入之前執(zhí)行,而END之后的操作將在掃描完全部的輸入之后執(zhí)行。因此通常BEGIN來顯示變量和初始化變量,使用END來輸出最終結果。

  2.awk中數(shù)據(jù)類型,是不需要定義,自適應的。 有時候需要通過(+、“”)強制轉換。

  3.awk數(shù)組下標是從1開始,與c數(shù)組不一樣。

  4.awk的多維數(shù)組在本質上是一維數(shù)組,更確切一點,awk在存儲上并不支持多維數(shù)組。awk提供了邏輯上模擬二維數(shù)組的訪問方式。例 如,array[2,4] = 1這樣的訪問是允許的。awk使用一個特殊的字符串SUBSEP (\034)作為分割字段,在上面的例子中,關聯(lián)數(shù)組array存儲的鍵值實際上是2\0344。多維數(shù)組可以使用if((i,j) in array)這樣的語法,但是下標必須放置在圓括號中。多維數(shù)組使用 for ( item in array )這樣的語法遍歷數(shù)組。與一維數(shù)組不同的是,多維數(shù)組必須使用split()函數(shù)來訪問單獨的下標分量。split ( item, subscr, SUBSEP)

  5.awk實現(xiàn)的性能是比shell實現(xiàn)的強

  上面就是Linux下awk文本處理工具的用法介紹了,因為awk是Linux下功能最強大的數(shù)據(jù)處理引擎之一,所以其用法要講解起來可不止文中介紹的這些,本文只是介紹了它的基本用法。

標簽 命令

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨特見解

立即評論

以上留言僅代表用戶個人觀點,不代表系統(tǒng)之家立場

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

掃碼關注
掃碼關注

掃碼關注 官方交流群 軟件收錄