AWK原理及命令和檔案輸入

foreverfriends發表於2017-04-18
一、awk簡介
 1.awk是3個姓氏的首字母,代表該語言的3個作者,awk的版本有很多,包括:舊版awk,新版awk(nawk),GNU awk(gawk)等。
   awk程式有awk命令,括在引號或寫在檔案中的指令以及輸入檔案這幾個部分組成。
 
 2.檢查系統中是否安裝有awk

 [root@rhel helinbash]# which awk
 /bin/awk

 [root@rhel helinbash]# which gawk
 /bin/gawk

 [root@rhel helinbash]# ls -l /bin/awk /bin/gawk
 lrwxrwxrwx 1 root root      4 Oct 10  2013 /bin/awk -> gawk
 -rwxr-xr-x 1 root root 320416 Jan 15  2007 /bin/gawk

注:以後的例子都是採用gawk命令

AWK簡介及使用例項 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell指令碼之AWK文字編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正規表示式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文字資料處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm


二、awk工作原理


 1.
以下內容的names檔名舉例按步驟解析awk的處理過程
 (1)
 vim    names
 Tom   Savage  100
 Molly Lee        200
 John  Doe       300
 (2)
 [root@rhel helinbash]# cat names.txt | cut -d  ' ' -f 2
 Savage

 Lee

[root@rhel helinbash]# cat names.txt | cut -d  '\t' -f 2  
 cut: the delimiter must be a single character
 Try `cut --help' for more information.
 [root@rhel helinbash]# 
(3)
 [root@rhel helinbash]# gawk '{ print $1,$3 }' names.txt
 Tom 100
 Molly 200
 John 300
  

[root@rhel helinbash]# gawk '{ print $1,$3 }' names.txt  

Tom    100
Molly  200
John   300
 

2. 原理圖
 FS:Field separator(分隔符)
 OFS:Output Field Separator

第三步:awk中print命令列印欄位;{print $1,$3} 只取有用的第一段和第三段;在列印時$1和$3之間由空格間隔。
“,”逗號是一個對映到內部的輸出欄位分隔符(OFS),OFS變數
預設為空格,逗號在輸出時被空格替換。
接下來,awk處理下一行資料,直到所有的行處理完。


三、從檔案輸入
 1.格式:
 gawk  '/匹配字串/'
 gawk  '{處理動作}'
 gawk  '/ 匹配字串/ {處理動作}' 檔名

 2. 使用awk查詢檔案中包含root的行
 [root@rhel helinbash]# gawk '/root/' /etc/passwd
 root:x:0:0:root:/root:/bin/bash
 operator:x:11:0:operator:/root:/sbin/nologin

#使用grep命令查詢

 [root@rhel helinbash]# grep root /etc/passwd
 root:x:0:0:root:/root:/bin/bash
 operator:x:11:0:operator:/root:/sbin/nologin


3.使用gawk命令查詢以root開頭的行
 [root@rhel helinbash]# gawk '/^root/' /etc/passwd
 root:x:0:0:root:/root:/bin/bash

4.
 [root@rhel helinbash]# gawk '/^root/'
 root
 root
 root
 root
 studnet
 t^H^[[3~^H^H^H this is a demo string wih^H^H iclcude root key woard
 
root hello abc
root hello abc
 
注:紅色的字型是過濾後的輸出,這個是gawk的互動式執行命令

 5. 以冒號為分隔符,列印第1列和第3列的資料,兩列之間用一個空格分隔
 [root@rhel helinbash]# gawk -F: '{ print $1,$3 }' /etc/passwd
 root 0
 bin 1
 daemon 2
 adm 3
 lp 4
 sync 5
 shutdown 6
 halt 7
 mail 8
 news 9
 uucp 10
 operator 11
 games 12
 gopher 13
 ftp 14
 nobody 99
 nscd 28
 vcsa 69
 rpc 32
 mailnull 47
 smmsp 51
 pcap 77
 ntp 38
 dbus 81
 avahi 70
 sshd 74
 rpcuser 29
 nfsnobody 65534
 haldaemon 68
 avahi-autoipd 100
 xfs 43
 gdm 42
 sabayon 86
 Oracle 500
 named 25

6. 檢視包含root行的行,並列印這些行的第1列和第3列
 [root@rhel helinbash]# gawk -F: '/root/{ print $1 $3 }' /etc/passwd  
 root0
 operator11


7.
 格式化輸出print函式
 awk命令操作處理部分是放在“{}”(括號)中;print函式將變數和字元夾雜著輸出。 如同linux中的echo命令
 
、從命令輸入

 1.awk還可以處理通過管道接收到的linux命令的結果,shell程式通常使用awk做深處理。
 
(1)
 格式:
 命令| gawk '/匹配字串/'
 命令| gawk '{處理動作}'
 命令| gawk '/匹配字串/ {處理動作}'
 (2)舉例
 [root@rhel helinbash]# date
 Mon May 26 10:10:01 CST 2014
 
[root@rhel helinbash]# date | gawk '{print "Month:"$2"\nYear:"$1 }' 

Month:May
Year:2014

[root@rhel helinbash]# date | gawk '{print "Month:",$2"\nYear:",$1 }' 
Month: May
Year: 2014


注意:如果在上面新增了逗號的話,那麼列印結果的冒號後會多一個空格作為分隔符。

(3)注意上面的例子,一種是直接在Month後連線$2,另一種是在Year和$6之間使用了逗號,都由OFS決定。

相關文章