Shell-awk

1. AWK

1. 基礎知識

  1. print $0的含義是打印整行,輸出到stdout。
  2. -F參數設置的是awk的初始化變量FS(我們在後面的章節將講到這個變量)。FS變量控制着awk的字段分隔符,默認情況下是空白字符。
  3. 在BEGIN代碼塊中,完成awk部分參數的初始化操作。END代碼塊,它是在所有的輸入都處理完後awk運行的代碼。
  4. awk的變量在建立時的初始值都是空字符串,但是當需要數值時,它會被視爲0。
  5. awk允許在數組名稱之後,以方括號將任意數字或字符串表達式括起來作爲索引。
  6. 數組也無需聲明就能使用。數組的存儲空間在引用新元素時會自動增長。
  7. delete array[index]會從數組中刪除元素,而delete array會刪除array數組中的所有元素。
  8. 在awk中只能使用print;不能使用echo。
  9. 在awk中使用的變量,不需要,使用$var引用變量。直接使用var即可獲取到值。 、
  10. awk核心代碼塊的執行次數和操作文件的行數一致; BEGIN和END只會執行一次

2. awk常見的內建變量

變量 描述
FILENAME 當前輸入文件的名稱
FNR 當前輸入文件的記錄數
FS 文件分隔符(默認爲空格,支持正則表達式)
NF 當前記錄的字段數
NR 在工作中的記錄數
OFS 輸出字段分割字符
ORS 輸出記錄分割字符(默認爲 “\n”)
RS 輸入記錄分割字符
ARGC 傳入的參數個數 eg: awk 'BEGIN{print "Args=", ARGC}' 1 2 343 4
ARGV 傳入的參數 eg: awk 'BEGIN{print "Argv1=", ARGV[1]}' 1 2 343 4;ARGV[0]爲awk;從ARGV[1]開始,纔是參數。

3. awk標準選項

選項 描述 示例
-v 該選項將一個值賦予一個變量,它會在程序開始之前進行賦值 awk -v name1=alex 'BEGIN{printf "name=%s\n", name1}'

4. awk條件判斷(&& || !)

  if (condition1 && condition2) {
     statement...
  } else if (condition1 || condition2) {
     statement...
  } else {
   statement...
 }

5. awk循環

  1. while循環
BEGIN {
  print "while is begin...."
}

{
    item=1
    while( item < 10 ) {
     item+=item
    }
}

END {
  print "while is end, item : " item
}
  1. do…while循環
{
 count=1

 do {
  print "count: " count++
 } while(count != 10)
}
  1. for循環
BEGIN{
 print "This is begin..."
}

{
   for(i=1; i<=10; i++) {
     print "item: " i
   }
}

END {
  print "This is end..."
}

6. awk執行流程

Created with Raphaël 2.2.0awk-BEGIN代碼塊讀取文件一行數據執行awk代碼塊是否讀取文件還有剩餘行?awk-END代碼塊yesno

7. 小案列

  1. 設置文件分隔符。
awk –F ":" '{print "USER: "$1 "\t SHELL: "$7}'  /tmp/passwd.piece
  1. 設置的分隔符爲正則表達式
awk -F "[\t ]+" '{print "DEVICE: "$1 "\t FSTYPE: "$3}' /etc/fstab
  1. 符合正則表達式時,執行腳本
awk  '/nologin/ {++adder}' num1.txt
  1. 使用條件判斷
awk '{if ($1>100){count++; print $1} \
else{count--;print $2}}' num2.txt
  1. 使用awk腳本來執行批量的awk指令,操作文件。
num1.awk
BEGIN{
  FS=":"
  print "This is begin!"
}

{
  if($1>100 && $1<200) {
     print $1 " is more than 100"
  } else if($1>200) {
     print $1" is more than 200"
  } else {
     less_than_100++
     print $1 " is less than 100" 
  }
}

END{
  print "Less than 100, count: " less_than_100
}

awk -f num1.awk num1.txt 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章