文件處理器之——awk

1、awk簡介:linux

awk 是一種編程語言,用於在 linux/unix 下對文本和數據進行處理。數據能夠來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。正則表達式

awk 的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操做。若是沒有指定處理動做,則把匹配的行顯示到標準輸出(屏幕),若是沒有指定模式,則全部的操做的所指定的行都被處理。編程

2、awk的兩種形式語法格式
bash

awk [options] 'commands' filenames   //過濾並輸出文件符合條件的內容
awk [options] -f awk-script-file filenam      //從腳本中調用編輯指令,過濾並輸出內容

options:
編程語言

-F  定義輸入字段分隔符,。默認的分隔符是空格或製表符(tab)

commands
ide

BEGIN{} {} END{}
行處理前 行處理 行處理後
BEGIN{} 一般用於定義一些變量,例如 BEGIN{FS=":";OFS="---"}

使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依據輸入文本開始執行,END語句用來在awk完成文本瀏覽動做後打印輸出文本總數和結尾狀態。函數

awk命令格式
工具

awk 'pattern' filename          示例:awk -F: '/root/' /etc/passwd 
awk '{action}' filename         示例:awk -F: '{print $1}' /etc/passwd 
awk 'pattern {action}' filename 示例:awk -F: '/root/{print $1,$3}' /etc/passwd 
                                示例:awk 'BEGIN{FS=":"} /root/{print $1,$3}' /etc/passwd
command |awk 'pattern {action}' 示例:df -P| grep '/' |awk '$4 > 25000 {print $4}'

3、awk工做原理
ui

# awk -F: '{print $1,$3}' /etc/passwd

(1)awk 使用一行做爲輸入,並將這一行賦給內部變量$0,每一行也可稱爲一個記錄,以換行符結束spa

(2)而後,行被:(默認爲空格或製表符)分解成字段(或域),每一個字段存儲在已編號的變量中,從$1 開始,最多達 100 個字段

(3)awk 如何知道用空格來分隔字段的呢? 由於有一個內部變量 FS 來肯定字段分隔符。初始時,FS 賦爲空格

(4)awk 打印字段時,將以設置的方法使用 print 函數打印,awk 在打印的字段間加上空格,由於$1,$3 之間有一個逗號。逗號比較特殊,它映射爲另外一個內部變量,稱爲輸出字段分隔符 OFS,OFS 默認爲空格

(5)awk 輸出以後,將從文件中獲取另外一行,並將其存儲在$0 中,覆蓋原來的內容,而後將新的字符串分隔成字段並進行處理。該過程將持續到全部行處理完畢

image.png

4、awk內建變量

FS:指定每行文本的字段分隔符,默認爲空格或製表位。(-F)
NF:當前處理的行的字段個數。
NR:當前處理的行的行號(序數)。
$0:當前處理的行的整行內容。
$n:當前處理行的第 n 個字段(第 n 列)。
FILENAME:被處理的文件名。RS:數據記錄分隔,默認爲\n,即每行爲一條記錄。


image.png

image.png

5、格式化輸出

print函數

# date |awk '{print "Month: " $2 "\nYear: " $NF}'
# awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd
# awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd

image.png

printf 函數

# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd

%s 字符類型

%d 數值類型

佔 15 字符

- 表示左對齊,默認是右對齊

printf 默認不會在行尾自動換行,加\n

image.png

===========================

6、awk模式

一、正則表達式

匹配記錄(整行):

# awk '/^alice/' /etc/passwd
# awk '$0 ~ /^alice/' /etc/passwd
# awk '!/alice/' passwd
# awk '$0 !~ /^alice/' /etc/passwd

匹配字段:匹配操做符(~     !~)

# awk -F: '$1 ~ /^alice/' /etc/passwd
# awk -F: '$NF !~ /bash$/' /etc/passwd

image.png

二、比較表達式:

比較表達式採用對文本進行比較,只有當條件爲真,才執行指定的動做。比較表達式使用關係運算符,

用於比較數字與字符串。


關係運算符

運算符 含義 示例

< 小於 x<y
<= 小於或等於 x<=y
== 等於 x==y
!= 不等於 x!=y
>= 大於等於 x>=y
> 大於 x>y
# awk -F: '$3 == 0' /etc/passwd
# awk -F: '$3 < 10' /etc/passwd
# awk -F: '$7 == "/bin/bash"' /etc/passwd
# awk -F: '$1 == "alice"' /etc/passwd
# awk -F: '$1 ~ /alice/ ' /etc/passwd
# awk -F: '$1 !~ /alice/ ' /etc/passwd
# df -P | grep '/' |awk '$4 > 25000'

image.png

三、條件表達式:

# awk -F: '$3>300 {print $0}' /etc/passwd
# awk -F: '{ if($3>300) print $0 }' /etc/passwd
# awk -F: '{ if($3>300) {print $0} }' /etc/passwd
# awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd

image.png

四、算術運算:+ - * / %(模) ^(冪 2^3)

能夠在模式中執行計算,awk 都將按浮點數方式執行算術運算

# awk -F: '$3 * 10 > 500' /etc/passwd
# awk -F: '{ if($3*10>500){print $0} }' /etc/passwd

image.png

五、邏輯操做符和複合模式

&& 邏輯與 a&&b
|| 邏輯或 a||b
! 邏輯非 !a
# awk -F: '$1~/root/ && $3<=15' /etc/passwd
# awk -F: '$1~/root/ || $3<=15' /etc/passwd
# awk -F: '!($1~/root/ || $3<=15)' /etc/passwd

image.png

六、範圍模式

# awk '/Tom/,/Suzanne/' filename

示例

一、統計系統給用戶數

image.png

二、統計用戶名爲4個字符的用戶

image.png

三、自定義變量。查詢root用戶

image.png

四、得到網卡IP(出ipv6之外的全部IP)

image.png

相關文章
相關標籤/搜索