Linux 下三劍客的技能,你敢不學?
來自:苦逼的碼農(微信號:di201805)
專註於寫【Java】、【計算機網路】、【數據結構與演算法】
本文字數:2355字
閱讀本文大概需要:6 分鐘
awk是一種用於處理文本、模式匹配的編程語言。與sed和grep,俗稱Linux下的三劍客。學會 awk 等於你在 Linux 命令行里,又多了一種處理文本的選擇。這篇文章重點教你如何使用,看完這篇文章,就大致知道如何使用了,力求簡單使用。
術語鋪墊
在awk的文本處理規則里,awk將文本文件視為由
欄位
和
記錄
組成的文本資料庫。默認情況下,awk將每一行視為一個記錄,也就是說記錄的分隔符是,記錄的分隔符可以通過內置變數RS更改。
在每一個記錄中,又把記錄分為若干個欄位,即記錄由欄位組成,而欄位的默認分隔符為
空格
或
製表符
。
一、基礎用法
和我們平常使用的 Linux 命令一樣, awk 也是遵循著某種格式來使用,格式如下:
# 使用格式
awk 執行的事件 文件
# 例如:
[root@iamshuaidi ~]# awk
"{print $0}"
test.txt
my
first
language
:Javasecond languange:
python
third
language
:C註:可以左右拉動
其中,print 表示列印,
$0
表示一整個記錄,test.txt 表示一個文件。所以
awk
$0
}" test.txt表示把 test.txt 文件裡面的每行記錄都列印出來。
剛才我們說,記錄是由欄位組成的,且欄位的默認分隔符是空格或者製表符。下面我們列印每一個記錄的第一個欄位,如下:
# 列印每一行的第一個欄位
[root@iamshuaidi
# awk "{print $1}" test.txt
my
second
third
$0 表示整個記錄,不過 $1, $2, $3.....則表示整個記錄中的第一個欄位,第二個欄位......。
剛才我們說欄位的默認分隔符是空格或者製表符這些,默認意味著我們可以自己顯式著
指定分隔符
。下面我們用「:」來作為我們的分隔符吧。
# 列印第二個欄位
[root@iamshuaidi ~]# awk -F
":"
"{print $2}"
test.txtJava
python
C
上面我們用參數
-F
指定了我們的分隔符,即如果想要指定欄位的分隔符,可以用參數 -F 指定分隔符。
二、條件限制
在列印文本的時候,我們可以指定一些條件。格式如下:
awk
參數 條件 要執行的動作 文件
例如我們指定分隔符為「:」,條件為第二個欄位為"Java"的記錄。
# 列印第二個欄位為
"Java"
的文本[root
@iamshuaidi
~]# awk -F":"
"$2 == "Java"
{print $2}"
test.txtJava
列印奇數行的的第二個欄位:
# 列印奇數行的記錄
[root@iamshuaidi ~]
# awk -F ":" "
NR % 2 == 1
{print $2}" test.txt
Java
C
其中,
NR
是一個內置的變數,表示當前正在處理的記錄,即當前的記錄是第幾個記錄。
三、條件語句
和我們平常的編程一樣,awk 也提供了 if, else, while 等這些條件語句。
例如,列印第二個及其之後的記錄:
root@iamshuaidi ~]# awk
"{
if(NR > 1)
print $2}"
test.txtlanguange:
python
language
:C注意,上面的欄位分隔符是空格了,並且 if 語句是在「{}」 里指定的。
再看一個例子:
# 如果第一個欄位大於「s",則列印第一個欄位,否則列印第二個欄位
[
root@iamshuaidi ~
]# awk "{
if
($1 < "s") print $1;
else
print $2}" test.txt
my
languange:python
language:C
註:可以左右拉動
上面列印的是:如果第一個欄位大於「s",則列印第一個欄位,否則列印第二個欄位。
四、函數
awk 提供了一些內置函數來供我們使用,一下常用的函數如下:
tolower
():字元轉為小寫。toupper():字元轉為大寫
length
():返回字元串長度。substr
():返回子字元串。sqrt
():平方根。rand
():隨機數。例如,我們要把列印的欄位轉化為大小
# 第一個欄位轉化為大寫輸出
[root@iamshuaidi ~]
# awk "{print toupper($1)}" test.txt
MY
SECOND
THIRD
五、變數
剛才我們說 NR 是一個表示當前正在處理的記錄是第幾個記錄的內置變數,常用的內置變數如下:
NR:表示當前處理的是第幾行
NF:表示當前行有多少個欄位
FILENAME:當前文件名
FS:欄位分隔符,默認是空格和製表符。
RS:行分隔符,用於分割每一行,默認是換行符。
OFS:輸出欄位的分隔符,用於列印時分隔欄位,默認為空格。
ORS:輸出記錄的分隔符,用於列印時分隔記錄,默認為換行符。
例如我們要列印每一個記錄的最後一個欄位,就可以使用變數
NF
了。
[root@iamshuaidi ~]# awk
"{print $NF}"
test.txtlanguage
:Javalanguange:
python
language
:C對了,剛才那個 NR 的變數也是挺好用的,例如:
# 標記當前是第幾行,這樣看起來好像比較舒服?
[root@iamshuaidi ~]# awk
"{print NR ". " $0}"
test.txt1
. myfirst
language
:Java2
. second languange:python
3
. thirdlanguage
:C講到這裡就大致結束了,這篇文章算是入門文章,屏蔽了很多細節,大致介紹一下怎麼使用,更多具體用法,可以根據自己想要實現的功能去查找相關函數哦。
●編號664,輸入編號直達本文
●輸入m獲取文章
目錄
推薦↓↓↓
運維
更多推薦
《
25個技術類公眾微信
》
涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。
※linux.org被黑客攻擊了,或因對Linux行為準則不滿
※Linux常用命令--系統狀態篇
TAG:Linux學習 |