????awk 是一個強大的文本分析工具剃毒。它不僅是Linux中病袄,也是任何環(huán)境中現(xiàn)有的功能最強大的數(shù)據(jù)處理引擎之一。相對于 grep 的查找赘阀,sed的編輯益缠,awk在其對數(shù)據(jù)分析并生成報告時,顯得尤為強大基公。
????當你第一次拿起雙手在電腦上使用 awk 命令處理一個或者多個文件的時候幅慌,它會依次讀取文件的每一行內容, 然后對其進行處理,awk 命令默認從 stdio 標準輸入獲取文件內容, awk 使用一對單引號來表示 一些可執(zhí)行的腳本代碼酌媒,在可執(zhí)行腳本代碼里面欠痴,使用一對花括號來表示一段可執(zhí)行代碼塊,可以同時存在多個代碼塊秒咨。 awk 的每個花括號內同時又可以有多個指令喇辽,每一個指令用分號分隔,awk 其實就是一個腳本編程語言雨席。說了這么多菩咨,你肯定還是一臉的懵逼。你猜對了陡厘,上面這些都是廢話抽米。先別急,客官請往下看……
????基本的awk語句本文就不討論了糙置,這里著重討論下awk的幾個使用方法
一云茸、變量
????我們都知道,awk中谤饭,$加數(shù)字代表打印每行的第N列标捺,$NF代表最后一列,$0代表整行
而$(NF-1)則可以代表倒數(shù)第二行
舉個例子:
]$ cat demo.txt
a:b:c:d:e:z
f:g:h:i:j
k:l:m:n:o
p:q:r:s:t
u:v:w:x:y
]$ awk -F ':' '{print $1, $(NF-1)}' demo.txt
a e
f i
k n
p s
u x
print里面的逗號表示輸出的時候揉抵,兩列之間用空格隔開
變量NR表示當前處理的是第幾行
]$ awk -F ':' '{print NR ": " $1}' demo.txt
1: a
2: f
3: k
4: p
5: u
print命令里亡容,如果要原樣打印字符,則字符要放在雙引號里冤今,例如上面例子中的 awk -F ':' '{print NR ": " $1}' demo.txt
awk還有其他的內置變量:
FILENAME:當前文件名
FS:字段分隔符闺兢,默認為空格和制表符
RS:行分隔符,用于分割每一行
OFS:輸出分隔符戏罢,用于打印時分隔字段屋谭,默認為空格
ORS:輸出記錄的分隔符,用于打印時分隔記錄龟糕,默認為換行符
OFMT:數(shù)字輸出的格式戴而,默認為%.6g
除了內置變量,awk也可以使用我們自定義的外部變量
方法一:
????使用“雙引號+單引號+變量+單引號+雙引號”翩蘸,這種寫法實際是把雙括號變?yōu)閱卫ㄌ柕某A克猓瑐鬟f給awk
]$ t="abc";awk 'BEGIN{print "'$t'"}'????
abc
方法二:
????使用“雙引號+單引號+變量+單引號+雙引號”,變量中如果有空格催首,為了避免shell把空格當成分隔符扶踊,則使用方法二
]$ t="a b c";awk 'BEGIN{print "'"$t"'"}'
a b c
方法三:
使用awk -v選項
]$ t="abc";awk -v v=$t 'BEGIN{print v}'???????
abc
二:函數(shù)
????awk提供了一些內置函數(shù),方便對原始數(shù)據(jù)進行處理郎任。
toupper()用于將字符轉換為大寫
]$ awk -F ':' '{ print toupper($1) }' demo.txt
A
F
K
P
U
其他常用函數(shù)還有:
tolower():字符轉為小寫秧耗。
length()
:返回字符串長度。
substr()
:返回子字符串舶治。
sin()
:正弦分井。
cos()
:余弦车猬。
sqrt()
:平方根。
rand()
:隨機數(shù)尺锚。
三:條件語句
????awk可以只輸出符合設定條件的行珠闰,條件需要寫在執(zhí)行動作之前。
awk '條件動作' 文件名
]$? awk -F ':' '/o/ {print $1}' demo.txt
k
上述語句瘫辩,print動作之前是一個正則匹配伏嗜,表示只輸出包含有字符“o”的行
]$ awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
a
k
u
上述語句表示只輸出奇數(shù)行
]$ awk -F ':' 'NR >2 {print $1}' demo.txt
k
p
u
上述語句表示只輸出第二行之后的行
]$ awk -F ':' '$1 == "p" {print $0}' demo.txt
p:q:r:s:t
上述語句表示只輸出第一個字段為“p”的行
[deployop@cnsz031479 cyj]$ awk -F ':' '$1 == "p" || $2 == "l" {print $0}' demo.txt
k:l:m:n:o
p:q:r:s:t
上述語句表示只輸出第一個字段為“p”或第二個字段為“l(fā)”的行
四、awk的if語句
????awk提供了if結構語句伐厌,用于編寫較復雜的條件環(huán)境
]$ awk -F ':' '{if ($1 > "g") print $0}' demo.txt
k:l:m:n:o
p:q:r:s:t
u:v:w:x:y
上述語句表示輸出第一個字段的第一個字符大于 g 的行
]$ awk -F ':' '{if ($1 > "g") print $1; else print "---"}' demo.txt
---
---
k
p
u
上述語句加入else承绸,表示如果第一個字段的第一個字符大于 g ,則輸出這一行的第一個字段挣轨,否則輸入“---”
以上就是本文討論的幾個awk的使用方法军熏,希望日常工作中幫到大家
謝謝