awk的強大操作
awk是一種用於處理文字、模式匹配的程式語言。與sed和grep,俗稱 下的三劍客。學會 awk 等於你在 Linux 命令列裡,又多了一種處理文字的選擇。這篇文章重點教你如何使用,看完這篇文章,就大致知道如何使用了,力求簡單使用。 |
在awk的文字處理規則裡,awk將文字檔案視為由欄位和記錄組成的文字資料庫。預設情況下,awk將每一行視為一個記錄,也就是說記錄的分隔符是 ,記錄的分隔符可以透過內建變數RS更改。
在每一個記錄中,又把記錄分為若干個欄位,即記錄由欄位組成,而欄位的預設分隔符為空格或製表符。
和我們平常使用的 Linux 命令一樣, awk 也是遵循著某種格式來使用,格式如下:
# 使用格式
awk 執行的事件 檔案
# 例如:
root@jaking-virtual-machine:~# awk '{print $0}' test.txt My first language:Python My second language:Shell My third language:Java My fourth language:C
其中,print 表示列印,$0 表示一整個記錄,test.txt 表示一個檔案。所以
awk '{print $0}' test.txt
表示把 test.txt 檔案裡面的每行記錄都列印出來。
$0 表示整個記錄,不過 $1, $2, $3.....則表示整個記錄中的第一個欄位,第二個欄位......。
root@jaking-virtual-machine:~# awk '{print $1}' test.txt My My My My root@jaking-virtual-machine:~# awk '{print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{print $3}' test.txt language:Python language:Shell language:Java language:C
剛才我們說欄位的預設分隔符是空格或者製表符這些,預設意味著我們可以自己顯式著指定分隔符。下面我們用“:”來作為我們的分隔符吧。
root@jaking-virtual-machine:~# awk -F ':' '{print $2}' test.txt Python Shell Java C
上面我們用引數 -F 指定了我們的分隔符,即如果想要指定欄位的分隔符,可以用引數 -F 指定分隔符。
在列印文字的時候,我們可以指定一些條件。格式如下:
awk 引數 條件 要執行的動作 檔案
例如我們指定分隔符為“:”,條件為第二個欄位為"Java"的記錄。
# 列印第二個欄位為"Java"的文字
root@jaking-virtual-machine:~# awk -F ':' '$2 == "Java" {print $2}' test.txt Java
列印奇數行的的第二個欄位:
# 列印奇數行的記錄
root@jaking-virtual-machine:~# awk -F ':' 'NR % 2 == 1 {print $2}' test.txt Python Java
其中,NR 是一個內建的變數,表示當前正在處理的記錄,即當前的記錄是第幾個記錄。
和我們平常的程式設計一樣,awk 也提供了 if, else, while 等這些條件語句。
例如,列印第二個及其之後的記錄:
root@jaking-virtual-machine:~# awk '{if(NR > 1) print $2}' test.txt second third fourth
注意,上面的欄位分隔符是空格了,並且 if 語句是在“{}” 裡指定的。
再看一個例子:
root@jaking-virtual-machine:~# awk '{if($1 < "s") print $1; else print $2}' test.txt # 如果第一個欄位小於“s",則列印第一個欄位,否則列印第二個欄位 My My My My root@jaking-virtual-machine:~# awk '{if($1 > "s") print $1; else print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{if($1 < "l") print $1; else print $2}' test.txt My My My My root@jaking-virtual-machine:~# awk '{if($1 > "l") print $1; else print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{if($1 > "c") print $1; else print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{if($1 > "d") print $1; else print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{if($1 > "p") print $1; else print $2}' test.txt first second third fourth root@jaking-virtual-machine:~# awk '{if($1 < "p") print $1; else print $2}' test.txt My My My My root@jaking-virtual-machine:~# awk '{if($3 < "s") print $3; else print $2}' test.txt language:Python language:Shell language:Java language:C root@jaking-virtual-machine:~# awk '{if($2 < "s") print $3; else print $2}' test.txt language:Python second third language:C root@jaking-virtual-machine:~# awk '{if($2 < "s") print $1; else print $2}' test.txt My second third My
awk 提供了一些內建函式來供我們使用,一下常用的函式如下:
tolower():字元轉為小寫。 toupper():字元轉為大寫 length():返回字串長度。 substr():返回子字串。 sqrt():平方根。 rand():隨機數。
root@jaking-virtual-machine:~# awk '{print toupper($1)}' test.txt MY MY MY MY root@jaking-virtual-machine:~# awk '{print tolower($1)}' test.txt my my my my root@jaking-virtual-machine:~# awk -F ':' '{print toupper($2)}' test.txt PYTHON SHELL JAVA C root@jaking-virtual-machine:~# awk -F ':' '{print tolower($2)}' test.txt python shell java c
剛才我們說 NR 是一個表示當前正在處理的記錄是第幾個記錄的內建變數,常用的內建變數如下:
NR:表示當前處理的是第幾行 NF:表示當前行有多少個欄位 FILENAME:當前檔名 FS:欄位分隔符,預設是空格和製表符。 RS:行分隔符,用於分割每一行,預設是換行符。 OFS:輸出欄位的分隔符,用於列印時分隔欄位,預設為空格。 ORS:輸出記錄的分隔符,用於列印時分隔記錄,預設為換行符。
例如我們要列印每一個記錄的最後一個欄位,就可以使用變數 NF 了。
root@jaking-virtual-machine:~# awk '{print $NF}' test.txt language:Python language:Shell language:Java language:C
對了,剛才那個 NR 的變數也是挺好用的,例如:
root@jaking-virtual-machine:~# awk '{print NR ". " $0}' test.txt 1. My first language:Python 2. My second language:Shell 3. My third language:Java 4. My fourth language:C
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2637363/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- awk 入門 —— 強大的文字分析工具
- awk強大的字串處理能力,快捷又方便字串
- awk多分隔符操作
- Awk 多檔案操作的實現方法
- Java8之Stream-強大的collect操作Java
- 向量化操作是 Pandas 的一個強大特性
- Shell字元操作命令——grep、sed、awk字元
- Linux Awk 陣列操作詳細介紹Linux陣列
- 強大的ognl
- Linux三大劍客之awkLinux
- 細數JS中實用且強大的操作符&運算子JS
- 強大的Github ActionsGithub
- 強大的 VS Code
- 強大的observejsJS
- Linux強大命令 Awk 20分鐘入門介紹Linux
- 寶付揭秘Linux支付命令操作之grep、sed、awkLinux
- awk的總結
- awk
- 強大的CAS機制
- 強大的 Guava 工具類Guava
- Swift 的強大之處Swift
- AWK的格式化輸出和檔案中的AWK
- Awk 字串連線操作(字串轉數字,數字轉字串)字串
- Sed&awk筆記之awk篇:快速瞭解Awk(一)筆記
- linux的awk命令Linux
- awk中的變數變數
- GoFrame - 強大的工具鏈集合GoFrame
- 向強大的SVG邁進SVG
- 強大的Array.prototype.splice()
- Chrome的強大搜尋功能Chrome
- 強大的Stream並行流並行
- webstorm比dreamweaver強大的地方WebORM
- 【Linux進階】使用grep、find、sed以及awk進行文字操作Linux
- Awk split
- awk命令
- gsub in awk
- awk 系列:如何讓 awk 使用 Shell 變數變數
- 《sed & awk》讀書筆記之 awk 篇筆記