當前位置:
首頁 > 知識 > Linux 下三劍客的技能,你敢不學?

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

:Java
second languange:

python


third

language

:C


註:可以左右拉動



其中,print 表示列印,

$0

表示一整個記錄,test.txt 表示一個文件。所以


awk

"{print

$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.txt
Java

python


C

上面我們用參數

-F

指定了我們的分隔符,即如果想要指定欄位的分隔符,可以用參數 -F 指定分隔符。


二、條件限制


在列印文本的時候,我們可以指定一些條件。格式如下:


awk

參數 條件 要執行的動作 文件

例如我們指定分隔符為「:」,條件為第二個欄位為"Java"的記錄。


# 列印第二個欄位為

"Java"

的文本
[root

@iamshuaidi

~]# awk -F

":"

"$2 == "Java"

{print $2}"

test.txt
Java


  


列印奇數行的的第二個欄位:


# 列印奇數行的記錄


[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.txt
languange:

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.txt

language

:Java
languange:

python


language

:C

對了,剛才那個 NR 的變數也是挺好用的,例如:


# 標記當前是第幾行,這樣看起來好像比較舒服?
[root@iamshuaidi ~]# awk

"{print NR ". "  $0}"

test.txt

1

. my

first

language

:Java

2

. second languange:

python


3

. third

language

:C

講到這裡就大致結束了,這篇文章算是入門文章,屏蔽了很多細節,大致介紹一下怎麼使用,更多具體用法,可以根據自己想要實現的功能去查找相關函數哦。



●編號664,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓



運維


更多推薦

25個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

linux.org被黑客攻擊了,或因對Linux行為準則不滿
Linux常用命令--系統狀態篇

TAG:Linux學習 |