awk 工具
阿新 • • 發佈:2021-01-03
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' 相同? 想想看,這是為什麼喔! _ |
| | 意義:用或( 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 處理流程:
- 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
- 依據 "條件型別" 的限制,判斷是否需要進行後面的 "動作";
- 做完所有的動作與條件型別;
- 若還有後續的『行』的資料,則重複上面 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 當中,變數可以直接使用,不需加上 $ 符號。