一文了解Shell中的awk命令

前言

AWK是一種處理文本文件的語言,是一個強大的文本分析工具。

之所以叫AWK是因爲其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

語法

awk [選項參數] 'script' var=value file(s)
或
awk [選項參數] -f scriptfile var=value file(s)

基本用法

awk的基本用法格式: awk [options] ‘program’ FILE…
語句之間用分號分隔

[options]
-F : 指明輸入時用到的字段分隔符
-v var=VALUE : 自定義變量
在awk中變量的引用不需要加$,而是直接引用

爲了方便後面的講解,我們新建一個測試的txt文件。
在這裏插入圖片描述
這裏每行的數據我們以空格進行分割。

用法1: awk ‘{[pattern] action}’ {filenames} # 行匹配語句 awk ‘’ 只能用單引號

例如 查看每一行數據的第一列和第四列的內容:
在這裏插入圖片描述
用法2:awk -F #-F相當於內置變量FS, 指定分割字符

例如,使用逗號,進行分割。
在這裏插入圖片描述
用法3:awk -v # 設置變量
在這裏插入圖片描述
用法4:基本的運算符
例如判斷大於或者相等:
在這裏插入圖片描述
用法5:使用正則表達式進行字符串匹配
例如,下面的例子

  1. 輸出第二列包含“th”,並打印第二列和第四列 或者打印整行
  2. 輸出該文件中國包含"a"的行數據
    在這裏插入圖片描述
    模式取反
    在這裏插入圖片描述

內置變量

變量:分爲內置變量和自定義變量;輸入分隔符FS和輸出分隔符OFS都屬於內置變量。

內置變量就是awk預定義好的、內置在awk內部的變量,而自定義變量就是用戶定義的變量。

FS(Field Separator):輸入字段分隔符, 默認爲空白字符
OFS(Out of Field Separator):輸出字段分隔符, 默認爲空白字符
RS(Record Separator):輸入記錄分隔符(輸入換行符), 指定輸入時的換行符
ORS(Output Record Separate):輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符
NF(Number for Field):當前行的字段的個數(即當前行被分割成了幾列)
NR(Number of Record):行號,當前處理的文本行的行號。
FNR:各文件分別計數的行號
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數

自定義變量的方法
方法一:-v varname=value ,變量名區分字符大小寫。
方法二:在program中直接定義。

awk腳本

關於awk腳本,我們需要注意兩個關鍵詞BEGIN和END。

  • BEGIN{ 這裏面放的是執行前的語句 }
  • END {這裏面放的是處理完所有的行後要執行的語句 }
  • {這裏面放的是處理每一行時要執行的語句}

假設有這麼一個文件(學生成績表):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

我們的awk腳本如下:

$ cat cal.awk
#!/bin/awk -f
#運行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#運行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#運行後
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我們來看一下執行結果:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

關於awk sed和grep三者的比較

awk、sed、grep更適合的方向:

  • grep 更適合單純的查找或匹配文本
  • sed 更適合編輯匹配到的文本
  • awk 更適合格式化文本,對文本進行較複雜格式處理

可參考資料:
1.Linux awk 命令
2.Linux之awk詳解

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