Linux文字處理三劍客之awk

2021-09-21 10:32:20 字數 4517 閱讀 8902

1.簡介

awk是linux下的乙個命令,他對其他命令的輸出,對檔案的處理都十分強大。

相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強

大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開

的部分再進行各種分析處理。其實他更像一門程式語言,他可以自定義變數,有條

件語句,有迴圈,有陣列,有正則,有函式等。他讀取輸出,或者文的方式是一行

,一行的讀,根據你給出的條件進行查詢,並在找出來的行中進行操作,感覺他的

設計思想,真的很簡單,但是結合實際情況,具體操作起來就沒有那麼簡單了。

awk有三種形勢,awk,gawk,nawk,平時所說的awk其實就是gawk。

2.awk的工作原理

awk 'begin pattern end'

第一步:執行begin語句塊中的語句;

第二步:從檔案或標準輸入(stdin)讀取一行,然後執行pattern

語句塊,它逐行掃瞄檔案,從第一行到最後一行重複這個過程,直到文

件全部被讀取完畢。

第三步:當讀至輸入流末尾時,執行end語句塊。begin語句

塊在awk開始從輸入流中讀取行之前被執行,這是乙個可選的語句塊,

比如變數初始化、列印輸出**的表頭等語句通常可以寫在begin語

句塊中。 end語句塊在awk從輸入流中讀取完所有的行之後即被執行

,比如列印所有行的分析結果這類資訊彙總都是在end語句塊中完成

,它也是乙個可選語句塊。 pattern語句塊中的通用命令是最重要的部

分,它也是可選的。如果沒有提供pattern語句塊,則預設執行

,即列印每乙個讀取到的行,awk讀取的每一行都會執行該語句塊。

3.awk工作模式模式可以是以下任意乙個: 

/正規表示式/:使用萬用字元的擴充套件集。

關係表示式:使用運算子進行操作,可以是字串或數字的比較測試。

模式匹配表示式:用運算子~(匹配)和~!(不匹配)。

begin語句塊、pattern語句塊、end語句塊。

4.例項

假設last -n 5的輸出如下

[root@www ~]# last -n 5 <==僅取出前五行

root     pts/1   192.168.1.100  tue feb 10 11:21   still logged inroot   pts/1   192.168.1.100  tue feb 10 00:46 - 02:28  (01:41)

root     pts/1   192.168.1.100  mon feb  9 11:41 - 18:30  (06:48)

dmtsai   pts/1   192.168.1.100  mon feb  9 11:41 - 11:41  (00:00)

root     tty1                   fri sep  5 14:09 - 14:10  (00:01)

如果只是顯示最近登入的5個帳號

#last -n 5 | awk  ''

root

root

root

dmtsai

rootawk

工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然後將記錄按指定的域分

隔符劃分域,填充域,$0則表示所有域,$1表示第乙個域,$n表示第n個域。

預設域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登入使用者,$3表示登入使用者ip,

以此類推。

如果只是顯示/etc/passwd的賬戶

#cat /etc/passwd |awk  -f ':'  ''  root

daemon

binsys

這種是awk+action的示例,每行都會執行action。

-f指定域分隔符為':'。

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

#cat /etc/passwd |awk  -f ':'  ''root    /bin/bash

daemon  /bin/shbin     /bin/shsys     /bin/sh

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分

割,而且在所有行新增列名name,shell,在最後一行新增"blue,/bin/nosh"。

cat /etc/passwd |awk  -f ':'  'begin  

end 'name,shell

root,/bin/bash

daemon,/bin/shbin,/bin/shsys,/bin/sh....

blue,/bin/nosh

搜尋/etc/passwd有root關鍵字的所有行

#awk -f: '/root/' /etc/passwdroot:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,匹配了pattern(這裡是root)的行才會執行action(沒有

指定action,預設輸出每行的內容)。

搜尋支援正則,例如找root開頭的: awk -f: '/^root/' /etc/passwd

搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell

# awk -f: '/root/' /etc/passwd             /bin/bash

這裡指定了action       

5,運算子

運算子描述

= += -= *= /= %= ^= **=    賦值    

?:    c條件表示式    

||    邏 輯或    

&&    邏輯與    

~ ~!    匹 配正規表示式和不匹配正規表示式    

< <= > >= != ==    關 系運算子    

空格    連線    

+ -    加,減    

* / &    乘,除與求餘    

+ - !    一元加,減和邏輯非    

^ ***    求冪    

++ --    增加或減少,作為字首或字尾    

$    字 段引用    

in    陣列成員    

例子:awk 'begin' 0 2

6,awk的正則

匹配符描述

\y    匹配乙個單詞開頭或者末尾的空字串    

\b    匹配單詞內的空字串    

\<    匹配乙個單詞的開頭的空字串,錨定開始    

\>    匹配乙個單詞的末尾的空字串,錨定末尾    

\w    匹配乙個非字母數字組成的單詞    

\w    匹配乙個字母數字組成的單詞    

\'    匹配字串末尾的乙個空字串    

\『    匹配字串開頭的乙個空字串    

7,字串函式

函式名描述

sub    匹配記錄中最大、最靠左邊的子字串的正規表示式,並用替換字串替換這些字串。如果沒有指定目標字串就預設使用整個記錄。替換只發生在第一次匹配的 時候    

gsub    整個文件中進行匹配    

index    返回子字串第一次被匹配的位置,偏移量從位置1開始    

substr    返回從位置1開始的子字串,如果指定長度超過實際長度,就返回整個字串    

split    可按給定的分隔符把字串分割為乙個陣列。如果分隔符沒提供,則按當前fs值進行分割    

length    返回記錄的字元數    

match    返回在字串中正規表示式位置的索引,如果找不到指定的正規表示式則返回0。match函式會設定內建變數rstart為字串中子字串的開始位 置,rlength為到子字串末尾的字元個數。substr可利於這些變數來擷取字串    

toupper和tolower    可用於字串大小間的轉換,該功能只在gawk中有效    

8,數學函式

函式名返回值

atan2(x,y)    y,x 範圍內的餘切    

cos(x)    余弦函式    

exp(x)    求 冪    

int(x)    取整    

log(x)    自然對 數    

rand()    隨機數    

sin(x)    正弦    

sqrt(x)    平 方根    

srand(x)    x是rand()函式的種子    

int(x)    取 整,過程沒有捨入    

rand()    產生乙個大於等於0而小於1的隨機數     

Linux文字處理三劍客

grep 作用 文字搜尋工具,根據使用者指定的 模式對目標檔案逐步進行匹配檢查,列印匹配到的行 grep root etc passwd grep命令選項 grep user etc passwd v 顯示不被pattern 匹配的行 e 僅顯示匹配到的字串 grep user etc passwd...

linux文字處理三劍客

常用引數 v 顯示不能夠被匹配到的行 i 忽略大小寫字元 o 僅顯示匹配到的字串 q 靜默模式,不輸出任何資訊 a 後 行 b 前 行 c 前後各 行 e 使用ere,相當於egrep常用引數 n 只列印模式匹配的行 e 直接在命令列模式上進行sed動作編輯,此為預設選項 f 將sed的動作寫在乙個...

文字處理三劍客

文字處理三劍客 劍客一 grep 作用 行 過濾 用法 grep 正規表示式 檔案 路徑 grep e 擴充套件類正規表示式 檔案 路徑 劍客二 sed 用法 sed 選項 位址定位sed命令 檔案 路徑 sed 選項 正規表示式 sed命令 檔案 路徑 sed 選項 位址定位 正規表示式 sed命...