awk功能很強大,慢慢學習使用吧mysql
下面使用均是學習視頻總結整理出來的,每一個方式都包含了至少一個實例,因爲視頻講解難以面面俱到,後續再查詢資料補充!正則表達式
awk 數據統計,日誌分析等 固定格式 awk 'pattern + { action }' file 好比: #假如a.log裏面的內容以下 hello world ! my name is zjj 5 is iter 對於a.log內容,每一行內容都默認以空格爲分割符,即上述文字能夠被分爲4列: 第一列 第二列 第三列 第四列 hello world ! my name is zjj 5 is iter 示例: #打印第一列($0表示全部列) awk '{print $1}' a.log 輸出: hello my 5 #打印第二列和最後一列 awk '{print $2,$NF}' a.log 輸出: world ! name zjj is iter #打印最後一列的前一列,對於a.log至關於第三列 awk '{print $(NF-1)}' a.log 輸出: world iter
對於文本,record表示行,field表示列,因此在awk裏面NR(Number of record), NF分別表示行數和列數 awk '{print NR,NF}' a.log 輸出: 1 3 2 4 3 3 #1,2,3表示當前文本的行號;3,4,3則表示每行的總列數,符合a.log內容 #上述命令和下述命令的區別: awk '{print NR NF}' a.log 輸出: 13 24 33 #將行號和列數拼接在了一塊兒 #NR和NF之間的","表示二者分割,默認的分隔符是空格,因此每行的數字,好比1和3,以空格分割: 1 3 #NR和NF之間的空格則表示二者鏈接,因此每行的數字,好比1和3,是字符串的鏈接: 13 #好比下面命令,$1和製表符之間是空格,表示二者鏈接,同時再和$2鏈接 #換句話說,也就是用製表符替換了空格做爲鏈接符,這樣可使打印出來的信息各列對齊 awk '{print $1 "\t" $2}' a.log 輸出: hello world my name
替換默認分隔符: #使用-F可替換默認的分隔符,好比-F:將使用:來替換默認的分隔符 #首先查看/etc/passwd awk '{print $0}' /etc/passwd | head -5 輸出: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #以:分割且在第一列和最後一列之間用--鏈接,""是鏈接符 awk -F: '{print $1"--"$NF}' /etc/passwd | head -5 結果: root--/bin/bash bin--/sbin/nologin daemon--/sbin/nologin adm--/sbin/nologin lp--/sbin/nologin #awk默認使用空格做爲輸入分割符,若是要替換則使用FS 執行:awk 'BEGIN{FS=","}{print $1,$2}' 鍵盤輸入: >aa,bb,cc 輸出: >aa bb #此時的輸入分隔符已經被替換成了",",那麼aa,bb,cc至關於三列,而aa bb cc至關於1列,打印第1,2列 #awk默認使用","做爲輸出分割符,若是要替換則使用OFS awk 'BEGIN{OFS=","}{print $1,$2}' >aa bb cc >aa,bb #原本輸出第1,2列應該是aa bb,二者之間使用空格分割,這裏被替換成了"," #輸入輸出分隔符都替換 awk 'BEGIN{FS=",";OFS=","}{print $1,$2}' >aa,bb,cc >aa,bb BEGIN:語句設置計數和打印頭部信息,在任何動做以前進行 END:語句輸出統計結果,在任何動做以後 打印出passwd中用戶UID大於1000的用戶名和登錄sehll >cat /etc/passwd | awk -F: '$3>1000{print $1 "\t" $3 "\t" $7}' 輸出: nfsnobody 65534 /sbin/nologin mysql 1001 /bin/bash 打印出系統中能登錄的普通用戶 >cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $3 "\t" $7}' 輸出: mysql 1001 /bin/bash 打印輸出信息是加上表頭(BEGIN) >cat /etc/passwd | awk -F: 'BEGIN {print "NAME \t SHELL"} $3>1000 && $7=="/bin/bash" {print $1 "\t" $7}' 輸出: NAME SHELL mysql /bin/bash 打印輸出信息是加上尾頭(END) >cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $7}END {print "NAME \t SHELL"}' 輸出: mysql /bin/bash NAME SHELL
#條件表達式 #注意字符串使用雙引號,數字則不用 #匹配文本中第一列爲"my"的行, 並輸出全部列 awk '$1=="my"{print $0}' a.log 輸出: my name is zjj #匹配數字 awk '$1==5{print $0}' a.log 輸出: 5 is iter #使用awk '$1=="5"{print $0}' a.log也能匹配 #打出第二行 awk 'NR=2{print $0}' a.log #awk的內置函數能夠賦值,這注意區分上面的格式,是否在{}內 #這裏表示將第2列的值替換爲xxxx,即隱藏輸出 awk '{$2="xxxx"; print NR "\t" $0}' a.log 輸出: 1 hello xxxx ! 2 my xxxx is zjj 3 5 xxxx iter #先輸出行號,再拼接製表符,在輸出全部的內容 命令格式: awk [-F | -f | -v] 'BEGIN{} // {command1;commonand2} END{}' file -F 指定分隔符 -f 調用腳本 -v 定義變量 '' 引用代碼塊 BEGIN 初始化代碼塊 // 匹配代碼塊,能夠是字符串或者正則表達式 {} 命令代碼塊,包含一條或多條命令 ; 多條命令使用分隔符 END 命令結束代碼塊
結合正則 正則的模式寫在//之間 只要包含abc便可匹配 1:/abc/ 實例: "abc" "xxabc" "xxabcxx" "xxab123cxx" --不匹配 執行:awk '/abc/{print $0}' 鍵盤依次輸入上述實例,符合要求則被輸出,不然輸出空 下面的實例操做方式相同! a和c之間有一個字符便可 2:/a.c/ "aac" "a.c" "a c" "xxabcxxxx" #轉義字符 3:/a\.c/ "/a.c/" /a\/c/ "/a/c/" 4:^ & ^之後面內容開頭 &之後面內容結尾 必須以abc開頭 /^abc/ "abc" "abcxxx" 必須以abc結尾 /abc$/ "abc" "xxxabc" 5:[] a和c之間只能匹配x,y,z,其餘的都不行 /a[xyz]c/ "axc" "ayc" "azc" "agc" --不匹配 a和c之間必須匹配a到z之間的值(不能爲空和大寫字母) /a[a-z]c/ "aac" "ac" --不匹配 "aZc" --不匹配 /a[a-zA-Z]c/ "aac" "aZc" "Aaac" 若是^在[]之間,表示非的意思 表示a和c之間不能出現a-z中的值 /a[^a-z]c/ "aac" --不匹配 "aZc" 6:* + *前面的字符出現0次或屢次 +前面的字符出現1次或屢次 /a*b/ "b" "ab" "aaaab" "" /a+b/ "ab" "aaab" "b" --不匹配 7:? 出現或者不出現 a出現或者不出現 /a?b/ "b" "ab" 8:{} 出現的次數 #ab必須出現3次 /ab{3}c/ "abbbc" b出現3到4次 /ab{3,4}c/ "abbbc" "abbbbc" "abbbbbc" --不匹配 b出現3到10次 /ab{3,10}c/ b至少出現3次,且只能包含b /ab{3,}c/ 9:() 把一段東西看作一個總體 /(ab)+c/ "abc" "abababc" "abbc" --不匹配
awk做爲編程語言 awk '{a=1;b=2; print a + b}' >回車輸出3 awk '{a=1;b=2; print a b}' >回車輸出12 awk '{a=1;b=2;c=5 print a b+c}' >回車輸出15 >先計算b+c,獲得5,再和1拼接獲得15 數字和字符串一塊兒計算時,只有數字在前面,awk纔會把表達式做爲數字運算 awk '{a=1;b="bbb";c=5 print b+c}' >獲得5 awk '{a=1;b="33bbb";c=5 print b+c}' >獲得38 awk '{a=1;b="bbb33";c=5 print b+c}' >獲得5 其餘的後續再整理!
其餘實例: #將ifconfig中的實際ip替換,替換規則:將.替換爲- #如:127.0.0.1 替換爲 127-0-0-1 >ifconfig eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.94.129 netmask 255.255.255.0 broadcast 192.168.94.255 inet6 fe80::20c:29ff:feca:bc99 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ca:bc:99 txqueuelen 1000 (Ethernet) RX packets 3561 bytes 346311 (338.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1564 bytes 345525 (337.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 340 (340.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 340 (340.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 00:00:00:00:00:00 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #獲取指定行 >ifconfig | grep 'broadcast' | head -1 結果:inet 192.168.94.129 netmask 255.255.255.0 broadcast 192.168.94.255 #按照默認的空格分隔符提取第二列 >ifconfig | grep 'broadcast' | head -1 | awk '{print $2}' 結果:192.168.94.129 #對ip進行處理,以.爲分割符,添加"-" >ifconfig | grep 'broadcast' | head -1 | awk '{print $2}' | awk -F. '{print $1"-"$2"-"$3"-"$4}' 結果:192-168-94-129 獲取df裏面use>40的信息 [zhuangjiajie@localhost home]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 36G 13G 23G 37% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 84K 1.9G 1% /dev/shm tmpfs 1.9G 9.0M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 297M 144M 154M 49% /boot tmpfs 378M 16K 378M 1% /run/user/42 tmpfs 378M 0 378M 0% /run/user/1000 >df -h | awk '/^\/dev/ {print $0}' | sed 's/%//g' | awk '$5 > 40 {print $1,$5"%"}' 解析:獲取df信息,而後以"/dev/"匹配,打印出所有列,而後將%全局替換爲空(去掉%纔好進行大於小於的比較), 最後再以第五列大於40做爲條件匹配,打印出第一和第五列,最後加上% 查詢進程,殺掉以後重啓腳本 ps -ef | grep apollo-portal | grep -v 'grep' | awk '{print $2}' | xargs kill -9 {} | xargs /wls/start.sh
後續再總結吧sql