linux命令學習---awk實例

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

相關文章
相關標籤/搜索