awk

*注意: awk的表達式須要使用單引號''mysql

awk:編輯器(主要處理有規律的文本)

程序模型:

打印:awk '{print}' a.txt
打印指定內容:awk '{print "hello",5}' a.txt
i++表示先賦值再加1
++i表示先加1再賦值
awk 'BEGIN{i=6}{print ++i}' a.txt
awk 'BEGIN{i=6}{print i++}' a.txt
BEGIN讀入文本以前的操做
awk '{print i++}END{print "hhh"}' a.txt
END讀入文本以後的操做正則表達式

模式匹配:

當匹配到//裏的正則表達式後才執行後面命令
awk '/aaa/{print ++i,"hhh"}' a.txt
打印第一個和第二個字段:$0表示全部
awk '{print $1,$2}' a.txt
指定字段變量:
awk 'BEGIN{a=2}{print $a}' a.txtsql


awk -F ';' '{}'
-F指定分隔符
\n 換行符
\t TAB鍵
\r 回車express

表達式:

常量:數字和字符串型
字符串型在表達式中必須用引號括起來
字符串中能夠使用轉義序列,經常使用的轉義序列有:
\n 換行 \t 水平製表符 \r 回車bash

賦值操做符:
++ i++=i+1
-- i--=i-1
+= i+=j i=i+j
-=
*=
/=
%=
^= app

系統變量:

FS 輸入定義字段分隔符,默認爲一個空格field seprator
OFS 輸出的字段分隔符,默認爲一個空格
awk 'BEGIN{FS=":";OFS="T"}{print $1,$2}' a.txt
RS 輸入記錄分隔符,默認爲一個換行符
ORS 輸出的記錄分隔符,默認爲一個換行符
awk 'BEGIN{RS="\t";ORS=" "}{print $1,$2}' a.txt
NR 行數
awk '{print NR}' a.txt
FNR 行數,多文件操做時會從新排序
awk '{print FNR}' a.txt ming
NF 字段的個數,$NF表示最後一個字段
awk 'BEGIN{FS=":"}{print NF}' a.txt
FILENAME 文件名
awk '{print FILENAME}' a.txttcp

關係操做符和布爾操做符

關係操做符:

< 小於Less than
> 大於Greater than
<= 小於等於Less than or equal to
>= 大於等於Greater than or equal to
== 等於Equal to
NF==5 NF(每一個輸入記錄的字段數)的值和5相比較,若是結果爲真,那麼就進行相應的處理,不然不進行處理。
!= 不等於Not equal to
~ 匹配Matches
$5~/MA/ {print $1 「,」$6}
!~ 不匹配Does not match
注意:關係操做符==和賦值操做符=是不一樣的編輯器

布爾操做符:

|| 邏輯或Logical OR
&& 邏輯與Logical AND
! 邏輯非Logical NOT
先執行關係操做符再執行布爾操做符post

格式化打印:

printf ( format-expression [, arguments] )
c ASCII 字符
d 十進制整數
f 浮點格式
s 字符串
x 無符號十六進制spa

經常使用舉例:

語法 %-width.precision format-specifier
printf(" %d \t %s \n ", $5 , $8 )
printf("|%10s|\n", "hello") 右對齊
printf("|%-10s|\n", "hello") 左對齊
printf("%*.*f\n", 5, 3, myvar) 寬度5 精度3 打印myvar

向腳本傳遞參數

var=root
awk –F: -v a=$var ‘$1==a {print}’ /etc/passwd

求階乘
5!=5*4*3*2*1

影響控制流
break 退出循環
continue 終止當前的循環,並從循環的頂部開始一個新的循環
影響主輸入循環
next 讀入下一行,並返回腳本的頂部
exit 使主輸入循環退出並將控制轉移到END

 

 

ll |awk 'BEGIN{printf("%-5s\t%s\n"),"name","size";FS=" ";}/^-/{printf ("%-5s\t%s\n",$NF,$5);i+=$5}END{printf("%-5s\t%s\n"),"total",i}'

ll |awk 'BEGIN{printf("%-5s\t%s\n"),"name","size";print "============";FS=" ";}/^-/{printf ("%-5s\t%s\n",$NF,$5);i+=$5}END{print "=============";printf("%-5s\t%s\n"),"total",i}'

 

 

awk NR NF

NR (number of row)表示行

NF (number of field) 表示列(默認值爲最後一列)

先來看一個實例:

獲取剩餘內存空間大小

[root@rhel6 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3828        791       3037          0        110        494
-/+ buffers/cache:        186       3642
Swap:         5999          0       5999
[root@rhel6 ~]# free -m | awk 'NR==3 {print $NF}'
3642

NF-5 == -6也就是倒數第四列

[root@rhel6 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3828        791       3037          0        111        494
-/+ buffers/cache:        186       3642
Swap:         5999          0       5999
[root@rhel6 ~]# free -m | awk 'NR==2 {print $(NF-5)}'
3828

awk -F

格式:-F'[:#/@¥$%]'   能夠定義多個分隔符, 支持正則表達式     -F '[      :]+'  使用空格和:分割,+表示能夠有連續的空格或:

用法:awk -F"[@/t]" '{print $1,$2,$3}' <test

     以@,Tab鍵分割test文件的每一行,並輸出第1、2、三列。

 

案例: 獲取每一個分區的Use空間

[root@rhel6 script]# df -Ph
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/VG01-lv_root  3.8G  510M  3.1G  14% /
tmpfs                     1.9G     0  1.9G   0% /dev/shm
/dev/sda1                 477M   88M  364M  20% /boot
/dev/mapper/VG01-lv_home  1.9G  3.7M  1.8G   1% /home
/dev/mapper/VG01-lv_opt   1.9G  139M  1.7G   8% /opt
/dev/mapper/VG01-lv_tmp   3.8G  7.9M  3.6G   1% /tmp
/dev/mapper/VG01-lv_usr   4.7G  2.0G  2.6G  44% /usr
/dev/mapper/VG01-lv_var   4.7G  509M  4.0G  12% /var
[root@rhel6 script]# df -h | awk 'NR==3 {print $(NF-1)}' | awk -F '[%]' '{print $1}'
14

過濾出mysql端口

[root@rhel6 script]# netstat -lntup | grep 3306 | awk -F "[ :]+" '{print $5}'
3306
[root@rhel6 script]# netstat -lntup | grep 3306 
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      16463/mysqld        

 

awk過濾

經過 /xxx|xxx|xxx/ 來進行過濾

[root@rhel6 script]# df -hP | awk -F '%' '/usr|tmp|var/{print $1}'
tmpfs                     1.9G     0  1.9G   0
/dev/mapper/VG01-lv_tmp   3.8G   81M  3.6G   3
/dev/mapper/VG01-lv_usr   4.7G  2.0G  2.5G  44
/dev/mapper/VG01-lv_var   4.7G  573M  3.9G  13
[root@rhel6 script]# df -hP | awk -F '%' '/usr|tmp|var/{print $2}'
 /dev/shm
 /tmp
 /usr
 /var
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息