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