日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

shell --- awk规范 系统总结

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell --- awk规范 系统总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • awk和sed的區別
      • awk腳本的流程控制
      • awk 記錄和字段
        • 字段的引用
      • awk表達式
        • 賦值操作符
        • 算數操作符
        • 系統變量(awk本身自定義的系統變量)
        • 關系操作符
        • 布爾操作符
      • awk 條件和循環
        • 條件語句
        • 循環
      • awk 的數組
        • 數組的定義
        • 數組的遍歷
        • 刪除數組
          • 舉例,編寫awk腳本文件`avg.awk`
        • 命令行參數數組
        • 復雜數組的使用案例
      • awk函數
        • 算數函數
        • 字符串函數
        • 自定義函數

awk和sed的區別

  • awk更像是腳本語言
  • awk用于“比較規范”的文本處理,用于統計數量并輸出指定字段
  • 使用sed 將不規范的文本,處理為“比較規范的文本”

awk腳本的流程控制

  • 輸入數據前 例程 BEGIN{},相當于預處理,進行變量定義
  • 主輸入循環{} ,一般只寫主輸入循環
  • 所有文件讀取完成 例程END{}

awk 記錄和字段

  • 每一行稱為 akw記錄
  • 使用空格、制表符分隔開的單詞稱為字段
  • 可以自己指定分隔的字段

字段的引用

  • awk中使用$1,$2,$3…$n表示每隔字段 awk '{print $1,$2,$3}' filename

  • awk 可以使用-F選項改變字段分隔符 awk -F, '{print $1, $2, $3}' filename
    分隔符可以使用正則表達式
    使用單引號作為分隔符,讀取以menu開頭的字段

    使用x++,可以打印行號

awk表達式

賦值操作符

  • =最常使用的操作符(等號前后可以增加空格)
    1. var1 = "name"
    2. var2 = "hello" "world" 賦值多個運算符
    3. var3 = $1
  • 其他賦值運算符
    ++ , -- , +=, -=, *=, /=, %=, ^=

算數操作符

  • +, -, *, /, %, ^

系統變量(awk本身自定義的系統變量)

  • FSOFS系統變量,OFS表示輸出的字段分隔符
    awk讀取每一行的內容之前,都會先讀取FSOFS表示的分隔符,輸入時進行字段的提取,輸出時根據OFS增加分隔符
    舉例如下:
    head -5 /etc/passwd | awk -F ":" '{print $1}'
    使用-F來分隔就等價于
    head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}',通過BEGIN讀入之前,設置好字段分隔符。
    增加OFS輸出字段分隔符

  • RS記錄分隔符,行之間的合并
    將每一行的記錄分隔符\n設置為:,則每當遇到:,即代表一行
    head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'

  • NRFNR行數
    當輸入為多個文件時,FNR可以重排多個文件,FR則都按照一個文件的行號排列

  • NF字段數量,最后一個字段內容可以用$NF取出字段內容
    head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}',輸出每一行的字段個數
    head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}',輸出最后一個字段的內容

關系操作符

<, >, <=, >=, ==, !=, ~, !~

布爾操作符

&&, ||, !

awk 條件和循環

條件語句

  • 條件語句使用 if開頭,根據表達式結果判斷執行哪一條語句
    if(表達式)awk 語句1
    [elseawk 語句2
    ]
    
  • 如果有多個語句需要執行,可以使用{}將多個語句括起來

循環

  • while循環
    while (表達式)awk 語句1
    
  • do循環
    do{awk 語句1
    }while(表達式)
    
  • for循環
    for(初始值;循環判斷條件;累加)awk 語句1
    
    使用for進行求和,并取平均值
    cat kpi.txt | awk '{sum=0;for(c=2;c<=NF;++c) sum+=$c;print sum/(NF-1)}'
  • 影響控制的其他語句
    break
    continue

awk 的數組

主要為了對awk進行多行關聯,多行之間進行通信

數組的定義

數組:一組有某種關聯的數據(變量),通過下標依次訪問

數組名[下標]=值
下標可以使用數字,也可以使用字符串。
PS:即使使用的是數字,awk也會將其當作字符串或者字符來處理

數組的遍歷

for (變量 in 數組名)
#使用 數組名[變量] 的方式依次對每個數組的元素進行操作

刪除數組

delete 數組[下標]
舉例,編寫awk腳本文件avg.awk
awk '{sum=0;\for(c=2;c<=NF;++c)\sum+=$c;\avg[$1]=sum/(NF-1)}\END{\for(user in avg)sum2+=avg[user];print sum2/NR}' \
kpi.txt

加載awk腳本文件
awk -f avg.awk kpi.txt

命令行參數數組

命令行參數數組:ARGC 參數個數 和ARGV代表的參數內容
主要用來輔助awk的腳本使用

編輯arg.awk

BEGIN{for(x = 0;x < ARGC;x ++)print ARGV[x] #打印每個參數內容print ARGC #打印參數個數
}

執行命令awk -f arg.awk 11 22 33
輸出如下:

awk #第0個參數,命令名稱
11
22
33
4  #總共四個參數(當前命令也會被記錄進去)

復雜數組的使用案例

編輯result.awk,用來進行總分,平均分、高于且低于平均分人數統計、分數評級、各個級別人數統計,該數據記錄在kpi.txt

{
sum = 0
for(c = 2; c <= NF; c++)sum += $cavg[$1] = sum / (NF - 1)if(avg[$1] >= 80) #統計每個人的評級level = "S"
else if(avg[$1] >=70)level = "A"
else if(avg[$1] >= 60)level = "B"
else level = "C"print $1,avg[$1],levelletter_all[level] ++ #關聯數組,統計各個評級的人數
}
END {
for(usr in avg)sum2 += avg[usr]avg_all = sum2 / NR #所有人的平均成績
print "avg_all is :",avg_allfor(usr in avg) #計算超過以及小于平均成績的人數if(avg[usr] >= avg_all)up++elsedown++print "biger than avg_all",up
print "less than avg_all",downprint "S:",letter_all["S"]
print "A:",letter_all["A"]
print "B:",letter_all["B"]
print "C:",letter_all["C"]
}

運行awk -f result.awk kpi.txt
其中kpi.txt內容如下:

user1 72 56 83 91
user2 55 67 45 89
user3 90 87 85 83
user4 56 57 99 95
user5 55 60 64 32

最終輸出如下:

user1 75.5 A
user2 64 B
user3 86.25 S
user4 76.75 A
user5 52.75 C
avg_all is : 71.05
biger than avg_all 3
less than avg_all 2
S: 1
A: 2
B: 1
C: 1

awk函數

算數函數

  • sin()cos()
  • int()
    awk 'BEGIN{pi=3.14;print int(pi)}'
  • rand() 偽隨機數 和 srand()重新獲取種子 0-1之間
    awk 'BEGIN{srand();print rand()}'

字符串函數

  • gsub(r,s,t) 字符串替換
  • sub(r,s,t)字符串替換
  • substr(r,s,t)字符串替換
  • split(s,a,sep) 字符串分割
  • match(s,r) 字符串匹配
  • length(s) 字符串長度
  • index(s,t)

通過man awk 搜索函數名稱,可以看到具體函數的功能以及詳細用法

自定義函數

函數定義的位置,寫在 BEGIN ,{},END之外

function 函數名(參數){awk 語句return awk 變量
}

舉例如下:
awk 'function a(){ return 0 } BEGIN{print a()}'

awk 'function twice(str) { return str str} BEGIN{print twice("hello awk")}'

總結

以上是生活随笔為你收集整理的shell --- awk规范 系统总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。