awk在我認爲簡直就是文本處理時打劫放火一大利器。 例如取出/etc/passwd中的第一列。 [root@CentOS6 ~]# awk -F: '{print $1}' /etc/passwd root bin daemon adm ...
選項 | 參數 | 說明 |
---|---|---|
-F | 指明輸入時用到的字段分隔符 | 若是不指定默認表明用正則表達式匹配多個空白字符 |
-v | var=value: 自定義變量 |
變量 | 介紹 | 說明 |
---|---|---|
FS | 輸入字段分隔符,默認爲空白 | 同-F效果同樣 |
OFS | 輸出字段分隔符,默認爲空白字符 | ‘{print $1,OFS,$2}’ |
RS | 輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效 | |
ORS | 輸出記錄分隔符,輸出時用指定符號代替換行符 | |
NF | 字段數量 | |
NR | 行號 | |
FNR | 各文件分別計數,行號 | awk '{print FNR}' /etc/fstab /etc/inittab |
FILENAME | 當前文件名 | |
ARGC | 命令行參數個數 | |
ARGV | 數組,保存的是命令行所給定的各參數 |
格式化輸出參數 | 介紹 |
---|---|
%c | 顯示字符的ASCII碼 |
%d, %i: | 顯示十進制整數 |
%e, %E | 顯示科學計數法數值 |
%f | 顯示爲浮點數 |
%g, %G | 以科學計數法或浮點形式顯示數值 |
%s | 顯示字符串 |
%u | 無符號整數 |
%% | 顯示% 自身 |
#[.#] | 第一個數字控制顯示的寬度;第二個# 表示小數點後精度,%3.1f |
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...linux
awk 程序一般由:BEGIN語句塊(最初執行)、被模式匹配的語句塊(中間執行)、END語句塊三部分構成(最後執行)。program一般被單引號或雙引號引中。不必定每種模式必定要用,pattern會最經常使用到 。正則表達式
printshell
須要顯示的內容逗號分割,支持字符串、數值、當前記錄的字段、變量或者awk的表達式。
express
awk -F: '{print $1,$3}' /etc/passwd($0表明整行) awk -F: '{print length($1),$1}' /etc/passwd 打印$1的字符數量 以及顯示$1
awk -F: 'i=1;j=1{print i,j}' /etc/passwd 請注意這裏有個坑,寫以前想下會是什麼結果,看打印出來和本身想的是否是同樣
printf編程
不會自動換行 須要制定換行控制符 「\n」
須要指定格式,使看起來更簡潔
[root@station38 testscr]# awk -F: '{printf "%-20s%s\t%s\n",$1,$2,$3}' /etc/passwd
數組
root x 0
tcp
bin x 1
函數
bin x 1
性能
bin x 1
測試
.....
算術運算支持賦值、算術運算、算術比較、模式匹配,支持正則。 邏輯操做符理論上最好只有一個&&或者|| 這樣可視性強
awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
awk -F: 'BEGIN{print "AAAAAAAA"}{printf "%-15s%-20d\n",$1,$3}END{print "BBBBBBBB"}' /etc/passwd AAAAAAAA root 0 bin 1 bin 1 bin 1 ... BBBBBBBB 先執行BEGING,而後讀取文件,讀入有/n換行符分割的一條記錄,而後將記錄按指定的域分隔符劃分域,填充域,$0則表示全部域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動做action。接着開始讀入第二條記錄······直到全部的記錄都讀完,最後執行END操做。
測試計算100之內3的倍數相加得數 顯示耗時
[root@station38 testscr]# time (seq -s + 3 3 100|bc) 1683 real 0m0.015s user 0m0.008s sys 0m0.006s
selector?if-true-expression:if-false-expression 若是?以前的條件爲真執行:以前的條件,若是?以前的條件爲假則執行最後的條件.
最後一個字段($NF)不等於 /sbin/nologin 爲真,執行name="sysuser" ,在執行最後的條件。 awk -F: '$NF != "/sbin/nologin"?name="sysuser":name="user"{printf "%-20s:%s\n",$1,$3}' /etc/passwd
netstat -nt | awk '/^tcp/{print $(NF-1)}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n3 訪問太過頻繁有危險扔黑名單 例如是 192.168.22.129的IP iptables -A INPUT -s 192.168.22.129 -p tcp --dport 80 -j REJECT
查看用戶屬因而普通用戶仍是系統用戶。 [root@station38 testscr]# awk -F: '{print $3,$4}' /etc/passwd | awk '{i=1;while(i<=NF){if($i<500)print $i,"smaller";else print $i,"bigger";i++}}' 0 smaller 0 smaller 993 bigger 113 smaller 113 smaller 995 bigger 992 bigger ...... 打印UUID 開頭的行的每段有多少字符 [root@station38 testscr]# awk '/^UUID/{i=1;while(i<=NF){print length($i);i++}}' /etc/fstab 41 1 4 8 1 1 41 ...... 找到/etc/grub2.cfg中開頭能夠有空白字符的行 後面跟linux16的行 顯示而且顯示有多少字符 [root@station38 testscr]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10)print $i,length($i);i++}}' /etc/grub2.cfg /vmlinuz-3.10.0-327.el7.x86_64 30 root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46 crashkernel=auto 16 ...... do-while的用法 while是條件爲真執行循環,do是無論真假先執行一次。這是惟一的區別 [root@station38 testscr]# awk '/^[[:space:]]*linux16/{i=1;do{print $i,length($i);i++}while(i<=NF)}' /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-327.el7.x86_64 30 root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 LANG=en_US.UTF-8 16 ...... 使用awk while循環實現1到100的加法 [root@station38 testscr]# awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}' 5050