1. 程式人生 > 實用技巧 >awk 工具

awk 工具

21.1.3

擴充套件正則表示式

RE 字元 意義與範例
+ 意義:重複『一個或一個以上』的前一個 RE 字元 範例:搜尋 (god) (good) (goood)... 等等的字串。 那個 o+ 代表『一個以上的 o 』所以,底下的執行成果會將第 1, 9, 13 行列出來。egrep -n 'go+d' regular_express.txt
? 意義:『零個或一個』的前一個 RE 字元 範例:搜尋 (gd) (god) 這兩個字串。 那個 o? 代表『空的或 1 個 o 』所以,上面的執行成果會將第 13, 14 行列出來。 有沒有發現到,這兩個案例( 'go+d' 與 'go?d' )的結果集合與 'go*d' 相同? 想想看,這是為什麼喔! _
egrep -n 'go?d' regular_express.txt
| 意義:用或( or )的方式找出數個字串 範例:搜尋 gd 或 good 這兩個字串,注意,是『或』! 所以,第 1,9,14 這三行都可以被列印出來喔!那如果還想要找出 dog 呢?egrep -n 'gd|good' regular_express.txt egrep -n 'gd|good|dog' regular_express.txt
() 意義:找出『群組』字串 範例:搜尋 (glad) 或 (good) 這兩個字串,因為 g 與 d 是重複的,所以, 我就可以將 la 與 oo 列於 ( ) 當中,並以 | 來分隔開來,就可以啦!egrep -n 'g(la|oo)d' regular_express.txt
()+ 意義:多個重複群組的判別 範例:將『AxyzxyzxyzxyzC』用 echo 叫出,然後再使用如下的方法搜尋一下!echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'上面的例子意思是說,我要找開頭是 A 結尾是 C ,中間有一個以上的 "xyz" 字串的意思~

格式化列印:printf

[root@www ~]# printf '列印格式' 實際內容
選項與引數:
關於格式方面的幾個特殊樣式:
       \a    警告聲音輸出
       \b    倒退鍵(backspace)
       \f    清除螢幕 (form feed)
       \n    輸出新的一行
       \r    亦即 Enter 按鍵
       \t    水平的 [tab] 按鍵
       \v    垂直的 [tab] 按鍵
       \xNN  NN 為兩位數的數字,可以轉換數字成為位元組。
關於 C 程式語言內,常見的變數格式
       %ns   那個 n 是數字, s 代表 string ,亦即多少個位元組;
       %ni   那個 n 是數字, i 代表 integer ,亦即多少整數碼數;
       %N.nf 那個 n 與 N 都是數字, f 代表 floating (浮點),如果有小數碼數,
             假設我共要十個位數,但小數點有兩位,即為 %10.2f 羅!

awk:好用的資料處理工具

awk 處理流程:

  1. 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
  2. 依據 "條件型別" 的限制,判斷是否需要進行後面的 "動作";
  3. 做完所有的動作與條件型別;
  4. 若還有後續的『行』的資料,則重複上面 1~3 的步驟,直到所有的資料都讀完為止。

awk 內建變數:

變數名稱 代表意義
NF 每一行 ($0) 擁有的欄位總數
NR 目前 awk 所處理的是『第幾行』資料
FS 目前的分隔位元組,預設是空白鍵

例:

[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
root     lines: 1        columns: 10
root     lines: 2        columns: 10
root     lines: 3        columns: 10
dmtsai   lines: 4        columns: 10
root     lines: 5        columns: 9

# 注意喔,在 awk 內的 NR, NF 等變數要用大寫,且不需要有錢字號 $ 啦!```
awk 邏輯運算位元組:

awk 邏輯運算位元組

運算單元 代表意義
> 大於
< 小於
>= 大於或等於
<= 小於或等於
== 等於
!= 不等於

例:

[root@www ~]# cat pay.txt | \ > awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" } NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'      Name        1st        2nd        3th      Total     VBird      23000      24000      25000   72000.00    DMTsai      21000      20000      23000   64000.00     Bird2      43000      42000      41000  126000.00
  • awk 的命令間隔:所有 awk 的動作,亦即在 {} 內的動作,如果有需要多個命令輔助時,可利用分號『;』間隔, 或者直接以 [Enter] 按鍵來隔開每個命令,例如上面的範例中,鳥哥共按了三次 [enter] 喔!
  • 邏輯運算當中,如果是『等於』的情況,則務必使用兩個等號『==』!
  • 格式化輸出時,在 printf 的格式配置當中,務必加上 \n ,才能進行分行!
  • 與 bash shell 的變數不同,在 awk 當中,變數可以直接使用,不需加上 $ 符號。