linux之awk

被时光移动的城市發表於2024-11-17

awk命令

  • 取行
  • 取列
  • 模糊匹配
  • 判斷比較
  • 字串比對
  • 數字比對
  • 支援
  • 格式化輸出

1.語法結構

sed -n '3p' file
awk 'NR==3' file

NR awk的內建變數 儲存著每行的行號
符號
== 等於第幾行
>  大於第幾行
>= 大於等於第幾行
<  小於第幾行
<= 小於等於第幾行
!= 不等
&& 並且 類似sed的 1,3
|| 或者 

awk預設就是輸出的動作 如果只輸出則不需要加print

[root@m01 ~]# awk 'NR==2' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@m01 ~]# awk 'NR==2{print}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
# awk取出檔案大於7的行 
# NR>7 NR<7 NR==7 NR!=7
[root@m01 ~]# awk  'NR>7' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.模糊過濾

語法結構: 支援正則
	    sed -n '//p' file
	    awk '//' file    # 模糊查詢檔案中的字串
	    awk '//,//' file # 區間範圍
	    
	    
# 過濾包含root的行
[root@m01 ~]# awk '/root/' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 找出以a開頭的行
[root@m01 ~]# awk '/^a/' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin

# 找出檔案中包含root或者adm的行
[root@m01 ~]# awk '/root|adm/' passwd 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

# 查詢出以s或者b開頭的行
[root@m01 ~]# awk '/^[sb]/' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

# 按照區間過濾 過濾日誌中的時間範圍
[root@m01 ~]# awk '/adm/,/ftp/' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

# 查詢以h結尾的行號
[root@m01 ~]# awk '/h$/' passwd 
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
userb:x:1004:1004::/home/userb:/bin/bash
userc:x:1005:1005::/home/userc:/bin/bash    

3.awk取列

語法結構:
		 awk '{print $1}' file # 取出檔案中的第1列
		 
預設按照空格或者tab鍵分隔成列
如果沒有空格或者tab鍵,awk會將整行看成一列
在awk中一切在動作中的字串都被看做是變數,加上雙引號則視為普通的字串

awk內建變數
$0  # 表示整行
$1  # 表示檔案的第1列 
$2  # 表示檔案的第2列
,   # 逗號表示空格
NF  # 表示每一行最後一列的列號

# 取出檔案中的第一列
[root@m01 ~]# awk -F ":" '{print $1}' passwd 
root
bin
daemon
adm
lp

# 取出檔案的第1列和第3列
[root@m01 ~]# awk -F ":" '{print $1,$3}' passwd |column -t
root             0
bin              1
daemon           2
adm              3
lp               4

4.awk數值運算

# 取出檔案中倒數第一列,和第二列
[root@m01 ~]# awk -F ":" '{print $NF,$(NF-1)}' passwd 
/bin/bash /root
/sbin/nologin /bin
/sbin/nologin /sbin
/sbin/nologin /var/adm

5.awk指定分隔符

語法結構:
	     awk -F: '{print $1}'    # 第一種指定分隔符方法
	     awk -F ":" '{print $1}' # 第二種指定分隔符方法
	     awk -F "[:/]"
	     awk -F ":|/"     

6.awk模式+動作

模式: 透過NR找出指定的行  awk 'NR==5'
	 透過模糊過濾的方式找出行 awk '/root/'
awk 'NR==5{print $1}'

# 輸出檔案中第2行的第2列
[root@m01 ~]# awk -F ":" 'NR==2{print $2}' passwd 
x

# 輸出檔案中的大於第2行的最後一列內容
[root@m01 ~]# awk -F ":" 'NR>2{print $2}' passwd 
x
x
x
x

# 輸出包含adm的行的 第3列
[root@m01 ~]# awk -F ":" '/adm/{print $3}' passwd 
3

7.awk比較表示式

  • 按照字元比對查詢行
# 查詢檔案中第1列等於root的行
[root@m01 ~]# awk -F ":" '$1=="root"' passwd 
root:x:0:0:root:/root:/bin/bash

# 使用正則匹配字串 提取第1列包含a的行
[root@m01 ~]# awk -F ":" '$1 ~ "a"' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
usera:x:1000:1000::/home/usera:/bin/bash

# 匹配最後一列以n結尾的行
[root@m01 ~]# awk -F ":" '$NF ~ "h$"' passwd 
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash

# 對root的行進行取反 第1列不包含root的行
[root@m01 ~]# awk -F ":" '$1 != "root"' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# 提取第1列不是以r開頭的行
[root@m01 ~]# awk -F ":" '$1 !~ "^r"' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

8.awk數字比對

# 第3列等於0的行
[root@m01 ~]# awk -F ":" '$3==0' passwd 
root:x:0:0:root:/root:/bin/bash

# 第3列小於5的行
[root@m01 ~]# awk -F ":" '$3<5' passwd 
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

# 提取第3列 大於5小於10的行
[root@m01 ~]# awk -F ":" '$3>5&&$3<10' passwd 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

# 提取第3列的第二行 在開始加上uid 結束加上 over
[root@m01 ~]# awk -F ":" 'BEGIN{print "==uid=="}NR==2{print $3}END{print "==over=="}' passwd 
==uid==
1
==over==

9.總結

1.awk取行  *****
awk 'NR==3' file
df -h|awk 'NR==5'
NR==3
NR!=3
NR>3
NR>=3
NR<3
NR<=3
&&
awk 'NR>3&&NR<6' file
||
awk 'NR==5||NR>8' file

2.awk模糊過濾  *****
awk '//' file
awk '//,//' file # 區間範圍
awk '/^/' file  # 支援正則  ^ $ | []

3.awk取列  *****
預設空格tab鍵為分隔符
$1 $2
awk '{print $1}' file
awk '{print $1,$2}' file
awk '{print $NF}' file  # 取出檔案中最後一列
awk '{print $(NF-1)}' file # 取出檔案中倒數第2列


4.awk指定分隔符 *****
awk -F
awk -F:
awk -F ":" '{print $1}' file
awk -F "[:/]" 指定任意單個
awk -F "[:/]+" 前字元出現連續1一次及以上作為1個字串
awk -Fa  # 指定a為分隔符

5.awk模式+動作 ***** 
awk 'NR==3{print $1}' # 第3行的第1列
awk 'NR>3&&NR<6{print $NF}' # 取出檔案中大於3小於6行的最後一列
awk '/root/{print $1,$NF}' # 將包含root行的第1列和最後一列
awk '$3>3{print $3}'  # 大於3的行的第3列


6.awk數值比對 字串比對 *****
awk '$3==0'
awk '$3>0'
awk '$3>80'
awk '$3<60'  #統計不及格的

awk -F: '$1=="root"' 
awk -F: '$1 ~ /^r/'
awk -F: '$NF ~ /n$/'

相關文章