linux學(xué)習(xí)-awk命令

awk的命令格式
awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定義列分隔符
-f 指定調(diào)用腳本
-v 定義變量
' '引用代碼塊,awk執(zhí)行語(yǔ)句必須包含在內(nèi)
BEGIN{ } 初始化代碼塊,在對(duì)每一行進(jìn)行處理之前,初始化代碼,主要是引用全局變量,設(shè)置FS分隔符
{ } 命令代碼塊,包含一條或多條命令
/ / 用來(lái)定義需要匹配的模式(字符串或者正則表達(dá)式),對(duì)滿足匹配模式的行進(jìn)行上條代碼塊的操作
END{ }  結(jié)尾代碼塊,在對(duì)每一行進(jìn)行處理之后再執(zhí)行的代碼塊,主要是進(jìn)行最終計(jì)算或輸出結(jié)尾摘要信息

$0           表示整個(gè)當(dāng)前行
$1           每行第一個(gè)字段
NF          字段數(shù)量變量
NR          每行的記錄號(hào),多文件記錄遞增
FNR         與NR類似,不過(guò)多文件記錄不遞增,每個(gè)文件都從1開(kāi)始
\t          制表符
\n          換行符
FS          BEGIN時(shí)定義分隔符
RS          輸入的記錄分隔符, 默認(rèn)為換行符(即文本是按一行一行輸入)
~            匹配,與==相比不是精確比較
!~           不匹配,不精確比較
==           等于,必須全部相等,精確比較
!=           不等于,精確比較
&&          邏輯與
||              邏輯或
+              匹配時(shí)表示1個(gè)或1個(gè)以上
/[0-9][0-9]+/   兩個(gè)或兩個(gè)以上數(shù)字
/[0-9][0-9]*/    一個(gè)或一個(gè)以上數(shù)字
FILENAME 文件名
OFS      輸出字段分隔符, 默認(rèn)也是空格,可以改為制表符等
ORS        輸出的記錄分隔符,默認(rèn)為換行符,即處理結(jié)果也是一行一行輸出到屏幕
-F'[:#/]'   定義三個(gè)分隔符

awk的內(nèi)建變量

image.png

創(chuàng)建一個(gè)實(shí)例文本

[root@Slave3 home]# cat netstat.txt 
Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN
例子1

輸出netstat.txt的第1,4列

  • 單引號(hào)中的被大括號(hào)括著的就是awk的語(yǔ)句,注意,其只能被單引號(hào)包含
  • 其中的1..n表示第幾例。注:$0表示整個(gè)行
[root@Slave3 home]# awk '{print $1,$4}' netstat.txt 
Proto Local-Address
tcp 0.0.0.0:3306
tcp 0.0.0.0:80
tcp 127.0.0.1:9000
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp :::22
例子2:格式化輸出
[root@Slave3 home]# awk '{printf "%-8s %-8s\n",$1,$2}' netstat.txt
Proto    Recv-Q  
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
列子3:輸出行號(hào)

NR表示行號(hào)

[root@Slave3 home]# awk '{print NR,$0}' netstat.txt 
1 Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
2 tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
3 tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
4 tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
5 tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
6 tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
7 tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
8 tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
9 tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
10 tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
11 tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
12 tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
13 tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
14 tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
15 tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
16 tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
17 tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
18 tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
19 tcp        0      0 :::22                  :::*                        LISTEN
例子4:過(guò)濾條件輸出

找到第三列是0且第六列是LISTEN的行并輸出
其他比較運(yùn)算符:!=, >, <, >=, <=

[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" {print $0}' netstat.txt
tcp        0      0 :::22                  :::*                        LISTEN
例子5:過(guò)濾+格式化輸出
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
Local-Address        Foreign-Address      State
:::22                :::*                 LISTEN
例子6:指定分隔符輸出
[root@Slave3 home]# cat /etc/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
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

-F: 表示使用:進(jìn)行分割
NR: 上面說(shuō)表示行號(hào),我們這了過(guò)濾出前9條數(shù)據(jù)

[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子7:指定分隔符分割并指定分隔符輸出

如例子6我們采用:作為分割符分割,輸出時(shí)默認(rèn)是采用空格來(lái)輸出每個(gè)列的,我們可以執(zhí)行輸出時(shí)的分割符

[root@Slave3 home]# awk -F:  'NR < 10 {print $1,$2}' OFS="\t"  /etc/passwd
root    x
bin x
daemon  x
adm x
lp  x
sync    x
shutdown    x
halt    x
mail    x
例子8:使用正則表達(dá)式過(guò)濾

$1 ~ /w+/ 表示第一列采用表達(dá)式w+來(lái)過(guò)濾。 ~表示模式開(kāi)始 //之間插入正則表達(dá)式

[root@Slave3 home]# awk -F: '$1 ~ /w+/ {print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
BCS-myview-web:x:476:471:BCS-myview-web:/home/BCS-myview-web:/bin/bash

awk常用正則表達(dá)式


image.png
例子9:反模式過(guò)濾

對(duì)例子8的結(jié)果取反,反模式采用的是!~

[root@Slave3 home]# awk -F: '$1 !~ /w+/ {print $0}' /etc/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
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
.....
例子10:拆分文件

按照第六列將第六列的值拆分成好幾個(gè)文件,例如第六列有aa,bb,cc,dd 則拆分后會(huì)分成 aa,bb,cc,dd這幾個(gè)文件,aa里面就包含第六列為aa的所有數(shù)據(jù)

[root@Slave3 xuzhiyong]# awk 'NR!=1{print > $6}' netstat.txt 
[root@Slave3 xuzhiyong]# ls
ESTABLISHED?  FIN_WAIT1?  FIN_WAIT2?  LAST_ACK?  LISTEN  LISTEN?  netstat.txt  TIME_WAIT?
[root@Slave3 xuzhiyong]# ll
total 32
-rw-r--r-- 1 root root  504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root   82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root  246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root   81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root   78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root  237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root  246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cd ESTABLISHED^M 
: Not a directoryISHED
[root@Slave3 xuzhiyong]# cat ESTABLISHED?
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
例子11:拆分文件采用if語(yǔ)句自定義拆分

NR!=1 表示不輸出第一行,就是表頭
里面的條件邏輯表示將第六行為TIME|ESTABLISHED放到1.txt;LISTEN放到2.txt;其他的放到3.txt

[root@Slave3 xuzhiyong]# awk 'NR!=1 {if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt"}' netstat.txt 
[root@Slave3 xuzhiyong]# ll
total 44
-rw-r--r-- 1 root root  750 Mar 22 17:46 1.txt
-rw-r--r-- 1 root root  315 Mar 22 17:46 2.txt
-rw-r--r-- 1 root root  409 Mar 22 17:46 3.txt
-rw-r--r-- 1 root root  504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root   82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root  246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root   81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root   78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root  237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root  246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cat 1.txt 
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
例子12: 統(tǒng)計(jì)字節(jié)數(shù)量

****awk命令是針對(duì)每一個(gè)行進(jìn)行的操作****
例如統(tǒng)計(jì)文件夾下這些文件的總共大小

[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h 
-rw-r--r-- 1 root root 73 Mar 24 05:54 1.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 1.cpp
-rw-r--r-- 1 root root  0 Mar 24 05:51 1.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 2.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 2.cpp
-rw-r--r-- 1 root root 57 Mar 24 05:55 2.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 3.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 3.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 4.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 4.h

使用管道命令 | 對(duì) ls -l .cpp .c .h 輸出的結(jié)果做統(tǒng)計(jì)。其中記住awk命令是針對(duì)每一個(gè)行進(jìn)行的操作*,所以{sum+=$5}表示每一行的第五列的值都加起來(lái),然后內(nèi)建變量END指定處理完每一行后的操作{print sum}

[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
130
例子13:統(tǒng)計(jì)2
[root@server-1 xuzhiyong]# awk 'BEGIN {count=0 ; print "=====start====="} {count++;} END {print "The file size is ",count}' /etc/passwd
=====start=====
The file size is  35
例子14:awk的內(nèi)嵌函數(shù)
image.png

image.png
[root@server-1 xuzhiyong]# awk '{print length($6)}' netstat.txt 
6
7
7
7
10
10
12
12
10
12
10
12
10
12
10
9
12
10
6
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,234評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,737評(píng)論 0 5
  • 簡(jiǎn)介 用簡(jiǎn)單的話來(lái)定義tcpdump,就是:dump the traffic on a network,根據(jù)使用者...
    保川閱讀 6,092評(píng)論 1 13
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,356評(píng)論 0 10
  • 1、資本:資本確實(shí)是由錢構(gòu)成的,但,僅僅是一堆錢放在那里肯定不算資本。 2、錢本身頂多可以算作資金,而它想要成為有...
    Demohour閱讀 210評(píng)論 0 0

友情鏈接更多精彩內(nèi)容