天天看點

awk,gawk基本用法筆記221107

AWK是一種程式設計語言。AWK 有幾種實作方式(主要以解釋器的形式)。AWK已被編入POSIX中。今天使用的主要實作是:

  • nawk(“ new awk”,oawk原始UNIX實作的演變),已在* BSD上使用,并在Linux上廣泛使用;
  • mawk,主要是堅持标準功能的快速實作;
  • gawk,GNU實作,具有許多擴充;
  • 在 Busybox的(小,适用于嵌入式系統,功能也不多)。

如果您隻關心标準功能,請緻電awk,它可以是gawk或nawk或mawk或其他實作。如果要使用GNU awk中的功能,請使用gawk或Perl或Python。

我的了解是: awk是将文本逐行篩選, 再将篩選行按(用

-F

指定的)

分割符

拆分成多列, 進行處理

基本格式
awk [選項] # 可以沒有
'單引号開始
BEGIN{ BEGIN語句塊代碼 }
/表達式/{表達式語句塊代碼} 
/表達式2/{表達式語句塊代碼} 
/表達式n/{表達式語句塊代碼} 
END{END語句塊代碼}
單引号結束'
檔案1,檔案2...檔案n # 如果有表達式塊,就要有輸入, 輸入可以用重定向或檔案 , 檔案不能寫在單引号内
           

隻用BEGIN{}語句塊的話,可以不要輸入流, 否則都要有輸入流

幾種簡單用法

例1 : 檢視包含"root"字元串的行

sudo awk /root/{print} /etc/passwd
           

👆效果如同👇

sudo grep root /etc/passwd
           

👆效果如同👇

sudo awk '/root/{print $0}' /etc/passwd
           

例2

如果語句塊中有空格,就要用引号包住

例3

例4

echo -e "world\n你" | awk '
	BEGIN { print "hello " }
	/wo/{print}
	/你/{print}
	END { print "好" } 
'
           

例5

awk '
	BEGIN{print "hello"} BEGIN{print "world"}
	BEGIN{print "世界"} BEGIN{print "你好"}
'
           

例6 : print 等效 print $0

sudo awk /root/{print} /etc/passwd
           
sudo awk '/root/{print $0}' /etc/passwd
           
選項

POSIX options: GNU long options: (standard)

-f progfile --file=progfile

-F fs --field-separator=fs

-v var=val --assign=var=val

Short options: GNU long options: (extensions)

-b --characters-as-bytes

-c --traditional

-C --copyright

-d[file] --dump-variables[=file]

-D[file] --debug[=file]

-e ‘program-text’ --source=‘program-text’

-E file --exec=file

-g --gen-pot

-h --help

-i includefile --include=includefile

-l library --load=library

-L[fatal|invalid|no-ext] --lint[=fatal|invalid|no-ext]

-M --bignum

-N --use-lc-numeric

-n --non-decimal-data

-o[file] --pretty-print[=file]

-O --optimize

-p[file] --profile[=file]

-P --posix

-r --re-interval

-s --no-optimize

-S --sandbox

-t --lint-old

-V --version

4個好記的常用選項: 大F , 小f , 大V , 小v

  • -F

    指定分隔符, 不指定的話, 預設是 空格 和 tab(\t)
  • -f

    指定檔案, 可以省略, 檔案路徑全名寫在最後即可
  • -v

    指定awk自己的變量
  • -V

    檢視版本
awk , nawk , mawk , gawk

awk 是一種程式設計語言,用于在linux/unix下對文本和資料進行處理。資料可以來自标準輸入、一個或多個檔案,或其它指令的輸出(即管道)。它支援使用者自定義函數和 動态正規表達式等先進功能,是linux/unix下的一個強大程式設計工具。它在指令行中使用,但更多是作為腳本來使用。

awk的處理文本和資料的方式是這 樣的,它逐行掃描檔案,從第一行到最後一行,尋找比對的特定模式的行,并在這些行上進行你想要的操作。如果沒有指定處理動作,則把比對的行顯示到标準輸出 (螢幕),即預設處理動作是print;如果沒有指定模式,則所有被操作所指定的行都被處理,即預設指定模式是全部。awk分别代表其作者姓氏的第一個字母。因為它的作者是三個人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴充。

像shell一樣,awk也有好幾種,常見的如awk、nawk、mawk、gawk,其中

awk:最初在1 9 7 7年完成,1 9 8 5年發表了一個新版本的awk,它的功能比舊版本增強了不少,awk 能夠用很短的程式對文檔裡的資料做修改、比較、提取、列印等處理,如果使用C 或P a s c a l 等語言編寫程式完成上述的任務會十分不友善而且很花費時間,所寫的程式也會很大;

nawk: 在 20 世紀 80 年代中期,對 awk語言進行了更新,并不同程度地使用一種稱為 nawk(new awk) 的增強版本對其進行了替換。許多系統中仍然存在着舊的awk 解釋器,但通常将其安裝為 oawk (old awk) 指令,而 nawk 解釋器則安裝為主要的 awk 指令,也可以使用 nawk 指令。Dr. Kernighan 仍然在對 nawk 進行維護,與 gawk 一樣,它也是開放源代碼的,并且可以免費獲得;

mawk:mawk 是 awk 程式設計語言的解釋器。awk語言在多媒體資料檔案以及文本的檢索和處理,算法的原型設計和試驗都有廣泛的使用。mawk帶給awk新的概念,它實作了在《The AWK Programming Language》(Aho, Kernighan and Weinberger, The AWK Programming Language, Addison-Wesley Publishing, 1988.被認為是 AWK 手冊。)中定義的 awk語言。mawk遵循 POSIX 1003.2 (草案 11.3)定義的 AWK 語言,包含了一些沒有在AWK 手冊中提到的特色,同時 mawk 提供一小部分擴充,另外據說mawk是實作最快的awk;

gawk: 是 GNU Project 的awk解釋器的開放源代碼實作。盡管早期的 GAWK 發行版是舊的 AWK 的替代程式,但不斷地對其進行了更新,以包含 NAWK 的特性;

目前,大家都比較傾向于使用awk和gawk,

  • Ubuntu系統中的各種awk的選項設定,可以通過sudo update-alternatives --config awk來完成,實際上你通過手動修改軟連結也能實作。
  • Debian最小化安裝的時候awk的連結是指向mawk的。

繼續閱讀