1. 程式人生 > 實用技巧 >Linux 常用工具命令

Linux 常用工具命令

索引

linux 常用工具命令

基礎命令

grep 搜尋字元

grep 命令用於在檔案中執行關鍵詞搜尋,並顯示匹配的效果。部分常用選項

引數 作用
-c 僅顯示找到的行數
-i 忽略大小寫
-n 顯示行號
-v 反向選擇,僅列出沒有關鍵詞的行,v是invert的縮寫。
-r 遞迴搜尋檔案目錄
-A n 列印匹配行的後面n行,A是after
-B n 列印匹配行的前面n行,B是before
-C n 列印匹配行的前後n行,相當於 -A n -B n

在auth.log檔案中查詢login關鍵字

grep login auth.log

在多個.log檔案中搜索

grep login *.log

遞迴目錄下所有檔案,在.log檔案中搜索

grep -r login *.log

不包含login的行

grep -v login auth.log

查詢並顯示行號

grep -n login auth.log

對login忽略大小寫進行搜尋

grep -i login auth.log

打印出包含login的行,打印出行號,並顯示前後3行,並忽略大小寫

grep -C 3 -i -n login auth.log

find 查詢檔案

通過檔名查詢檔案的所在位置,檔名查詢支援模糊匹配

find  [指定查詢目錄]  [查詢規則]  [查詢完後執行的action]

常用的查詢規則:

檔名 -name -iname

  • find . -name syslog 在當前目錄下(包含子目錄)查詢syslog檔案
  • find . -iname syslog 忽略檔名稱大小寫
  • find /etc -name *.conf 查詢/etc目錄下.conf結尾的檔案

深度 -maxdepth-mindepth

  • find /etc -maxdepth 3 -name *.conf 最大子目錄深度為3
  • find /etc -maxdepth 2 -mindepth 2 -name *.conf 只在第二層中查詢

檔案大小 -size

  • find /mnt -size 20K 查詢/mnt目錄下大小近似20K的檔案
  • find /mnt -size -20K 小於20K的檔案
  • find /mnt -size +20K 大於20K的檔案

檔案型別 -typef為檔案,d為目錄,l為連結檔案

  • find /mnt -type f 查詢/mnt目錄下的檔案
  • find /mnt -type d 查詢目錄

檔案時間 -atime最後訪問時間(單位天),-mtime檔案內容最後修改時間(單位天),-ctime 檔案許可權、擁有者、所屬組、及檔案內容最後變化的時間(單位天)。同理 -amin -mmin -cmin單位是分鐘

  • find /etc -mtime -2 查詢/etc目錄2天內修改過的檔案
  • find /tmp -mmin +60 查詢/tmp目錄最後修改時間超過60分鐘的檔案

其他屬性

  • find /tmp -empty查詢/tmp目錄下的空檔案和空目錄
  • find /tmp -type d -empty /tmp目錄下的空目錄
  • find /etc -type f -executable 在/etc目錄下搜尋具有可執行許可權的檔案

常用的執行action

  • -ls 按照ls -l格式顯示搜尋到的檔案

    find /tmp -type f -ls 	# 使用 ls -l 格式顯示/tmp下面的檔案
    
  • -print 沒有其他action時,預設值,顯示搜尋到的檔案

  • -delete 刪除搜尋到的檔案或目錄,目錄要為空目錄才能被刪除,空目錄會被遞迴刪除(直到被搜尋的目錄被刪除)

    find /tmp/xxx -type d -empty -delete	# 刪除/tmp/xxx目錄下的空目錄(如果到最後/tmp/xxx也為空,則也會被刪除)
    
  • -exec 執行子命令,使用{}代替搜尋到的檔名字,命令需要;結尾,;應該加上\進行轉義。

    find /etc/redis -name *.conf -exec cp {} /tmp/redis \; # 將/etc/redis下的.conf檔案全部拷貝到/tmp/redis目錄下。
    

ls 顯示檔案

  • -l 按行顯示詳情
  • -h 人性化的顯示檔案大小
  • -t 按修改時間排序,需要結合-l使用
  • -r 反序
  • -R遞迴遍歷子目錄
  • -n 顯示使用者id和組id(gid)
  • -f不排序顯示,目錄下檔案較多時,效果很好。

按時間排序顯示,最近修改的檔案在前面

ls -lt

按時間逆序顯示,最老的檔案在前面

ls -lrt

wc 統計字數

wc命令用於計算字數。 利用wc指令我們可以計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-",則wc指令會從標準輸入裝置讀取資料。

  • -l 僅顯示檔案行數
  • -c僅顯示位元組數
  • -w僅顯示單詞數

預設用法

wc /etc/passwd
34   50 1817 /etc/passwd	# 34是行數,50是單詞數,1817是位元組數

統計/var/log/message行數

wc -l /var/log/message

uptime 機器啟動時間+負載

檢視機器的啟動時間、登入使用者、平均負載等情況,通常用於在線上應急或者技術攻關中,確定作業系統的重啟時間。

$ uptime
 16:18:06 up 9 days,  6:35, 10 users,  load average: 2.01, 2.01, 2.00

解釋:

  • 16:18:06是當前系統時間。
  • up 9 days, 6:35 是距離開機9天,6小時,35分鐘。
  • 10 users線上使用者數量。
  • load average: 2.01, 2.01, 2.00 最近1分鐘,5分鐘,15分鐘的系統負載情況。

系統的平均負載是指在特定的時間間隔內佇列中執行的平均程序數。如果一個程序滿足以條件,它就會位於執行佇列中。

  • 它沒有在等待I/O操作的結果。
  • 它沒有主動進入等待狀態(也就是沒有呼叫’wait'相關的系統API )
  • 沒有被停止(例如:等待終止)。

如果每個CPU核心的當前活動程序數不大於3的話,那麼系統的效能還算可以支援。

如果每個CPU核心的任務數大於5,那麼這臺機器的效能有嚴重問題。

如果你的linux主機是1個雙核CPU的話,當Load Average 為6的時候說明機器已經被充分使用了。

負載說明(現針對單核情況,不是單核時則乘以核數

  • load<1:沒有等待
  • load==1:系統已無額外的資源跑更多的程序了
  • load>1:程序都堵著等待資源

注意

  • load < 0.7時:系統很閒,要考慮多部署一些服務
  • 0.7 < load < 1時:系統狀態不錯
  • load == 1時:系統馬上要處理不多來了,趕緊找一下原因
  • load > 5時:系統已經非常繁忙了

不同load值說明的問題

  1. 1分鐘 load >5,5分鐘 load <3,15分鐘 load <1:短期內繁忙,中長期空閒,初步判斷是一個抖動或者是擁塞前兆
  2. 1分鐘 load >5,5分鐘 load >3,15分鐘 load <1:短期內繁忙,中期內緊張,很可能是一個擁塞的開始
  3. 1分鐘 load >5,5分鐘 load >5,15分鐘 load >5:短中長期都繁忙,系統正在擁塞
  4. 1分鐘 load <1,5分鐘Load>3,15分鐘 load >5:短期內空閒,中長期繁忙,不用緊張,系統擁塞正在好轉

補充:

檢視cpu資訊:cat /proc/cpuinfo

直接獲取cpu核數:grep 'model name' /proc/cpuinfo | wc -l

ulimit 使用者資源

Linux系統對每個登入的使用者都限制其最大程序數和開啟的最大檔案控制代碼數。為了提高效能,可以根據硬體資源的具體情況設定各個使用者的最大程序數和開啟的最大檔案控制代碼數。可以用ulimit -a來顯示當前的各種系統對使用者使用資源的限制:

root@debian:~# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15096
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

設定使用者的最大程序數

ulimit -u 1024

設定使用者可以開啟的最大檔案控制代碼數

ulimit -n 65530

scp 遠端檔案拷貝

secure copy的縮寫, scp是linux系統下基於ssh登陸進行安全的遠端檔案拷貝命令。

scp命令是Linux系統中功能強大的檔案傳輸命令,可以實現從本地到遠端,以及從遠端到本地的雙向檔案傳輸,用起來非常方便,常用來在線上定位問題時將線卜的一些檔案下載到本地進行詳查,或者將本地的修改上傳到伺服器上

常用方式:

下載172.16.1.15的/home/test.txt到本地目錄下

scp [email protected]:/home/test.txt .

上傳檔案到遠端/tmp下

scp test.txt [email protected]:/tmp/

下載整個test目錄到本地

scp -r  [email protected]:/tmp/test .

上傳整個test目錄到遠端

scp -r test [email protected]:/tmp/

如果ssh埠不是預設的22,使用-P指定埠

scp -P 1022 test.txt [email protected]:/tmp/

rsync 檔案同步

可以方便的同步目錄,注意所有的目錄都需要/結尾

將AAA目錄下的所有檔案同步到BBB目錄下

rsync -av AAA/ BBB/

測試,而不是實際執行,使用-n

rsync -avn AAA/ BBB/

注意目錄結尾加/和不加/的區別,如下:

$ rsync -avn AAA/dir1 BBB/		 # 將dir1目錄同步到BBB目錄下,dir1目錄將被拷貝到BBB目錄下
sending incremental file list
dir1/
dir1/dir11/
dir1/dir11/file111.txt

sent 122 bytes  received 27 bytes  298.00 bytes/sec
total size is 12  speedup is 0.08 (DRY RUN)

$ rsync -avn AAA/dir1/ BBB/		# 將dir1目錄下的所有檔案同步到BBB目錄下
sending incremental file list
./
dir11/
dir11/file111.txt

sent 113 bytes  received 26 bytes  278.00 bytes/sec
total size is 12  speedup is 0.09 (DRY RUN)

dos2unix 和 unix2doc 轉換換行符

用於轉換Windows和UNIX的換行符,通常在Windows系統上開發的指令碼和配置,UNIX系統下都需要轉換。

使用方式:

  • dos2unix test.sh 將windows系統換行符\r\n轉換為unix系統換行符\n
  • unix2doc test.sh 將unix系統換行符\n轉換為windows系統換行符\r\n

curl HTTP協議測試

由於當前的線上服務較多地使用了RESTful風格的API,所以整合測試就需要進行HTTP呼叫,檢視返回的結果是否符合預期,curl命令當然是首選的測試方法。

  • -i 列印響應頭資訊。

  • -v 列印更多的除錯資訊。

  • -X 設定請求方法,預設為GET。

    curl localhost:8000/v1/test 					# 使用GET方法請求localhost的8000埠的 /v1/test
    curl -X POST localhost:8000/v1/test 	# 使用POST方法
    
  • --header 設定頭部欄位;使用--header 'key: value'格式,比如:--header 'Content-Type: application/json' 設定資料為json格式。

  • -d --data POST資料內容;使用-d 'key=value'格式。

  • --data-raw POST原始資料內容。例如:

    $ curl -X POST 'http://localhost:8000/v1/test' \
    --header 'Content-Type: application/json' \
    --data-raw '{"aa": "中文測試", "bb": "bb", "cc": ["cc1", "cc2"], "ee": "ee"}'
    
  • --form POST表單格式;使用--form 'key=value' 格式;後面跟檔案的話,使用--form 'file=@本地檔案路徑'。例如:

    $ curl -X POST 'http://127.0.0.1:8000/v1/test' \
    --form 'aa=中文測試' \
    --form 'bb=bb1' \
    --form 'cc=cc1' \
    --form 'cc=cc2' \
    --form 'ee=ee' \
    --form 'file=@/root/20200401175738.png'
    
  • -sw '%{http_code}' 列印http響應碼, -s--silent-w--write-out FORMAT,例如

    curl -sw '%{http_code}' http://www.baidu.com
    

sed

簡單模式
sed   -n   '2,5 p'   file.txt

一個簡單的sed命令包含三個主要部分:引數範圍操作。要操作的檔案,可以直接掛在命令列的後面。

上面的命令,-n就是引數,2,5就是範圍,p就是操作。

第一部分,引數
  • -n 忽略執行過程的輸出,只輸出我們執行的結果。

  • -i 直接修改原檔案,-iSUFFIX 先備份原檔案,再直接修改檔案。

    • sed -i 's/c++/python/' sed-test.txt 對sed-test.txt檔案,直接在原檔案中將c++替換為python。
    • sed 's/c++/python/' sed-test.txt 將替換後的結果列印在終端上,而不是修改檔案。
    • sed -i.bak 's/c++/python/' sed-test.txt 先將sed-test.txt檔案備份為sed-test.txt.bak,再對sed-test.txt檔案進行替換操作。
第二部分,範圍

範圍就是表示對選擇指定的內容,然後進行後面的操作。沒有選擇範圍就是對整個檔案操作。

  • n,m表示選擇從第n行到第m行的內容。比如2,5表示選擇2,3,4,5行內容。
  • n,+m表示選擇從第n行到第n+m行的內容。比如2,+5表示選擇2,3,4,5,6,7行內容。
  • n,$表示選擇從第n行到最後一行的內容。
  • n~m表示從n行開始每次間隔m行。比如1~2表示奇數行;2~2表示偶數行;3~3表示從第3行開始,每隔3行的內容,即為3,6,9,12,...的行內容。

範圍還可以使用正則匹配

  • /void/,+3 選擇出現void字樣的行,以及後面的三行。
  • 2/^void/,/mem/ 選擇以void開頭的行,和出現mem字樣行之間的資料。

舉例子:範圍和操作之間可以有空格,也可以沒有空格

sed -n '5p' sed-test.txt	# 列印第5行的內容
sed -n '2,5 p' sed-test.txt 	# 列印第2到5行的內容
sed -n '1~2 p' sed-test.txt	# 列印奇數行內容
sed -n '2~2 p' sed-test.txt 	# 列印偶數行內容
sed -n '2,+3p' sed-test.txt		# 列印第2行以及後面3行的內容,也就是2,3,4,5行
sed -n '2,$ p' sed-test.txt   # 列印第2行到最後的內容
sed -n '/void/,+3p' sed-test.cpp # 列印包含void字樣的行以及後面的3行
sed -n '/^void/,/return/p'	# 列印以void開頭的行和包含return的行之間的內容
第三部分,操作
  • p列印內容。比如下面2個命令效果是一樣的:

    cat file
    sed -n 'p' file
    
  • d對匹配的內容進行刪除。這個時候就要去掉-n引數了,想想為什麼

    sed '2,5 d' sed-test.txt	  # 顯示除了第2行到第5行之外的其他行內容。假如檔案有7行,會顯示1,6,7行內容。
    sed -n '2,5 d' sed-test.txt	# 如果加上-n,則什麼都不會顯示。
    
  • w對匹配內容寫入到其他地方。比如將第2到5行的之間的內容儲存到(不是追加到)/tmp/xxx.txt檔案中,可以這麼寫:

    sed -n '2,5w/tmp/xxx.txt' sed-test.txt
    sed -n '2,5 w /tmp/xxx.txt' sed-test.txt  # 也可以加空格
    

其他的還有a i c等操作,但基本上不會使用,這裡不介紹了。

替換模式

以上是sed命令的常用匹配模式,但它還有一個強大的替換模式,意思就是查詢替換其中的某些值,並輸出結果。使用替換模式很少使用-n引數。

sed '/^sys/S/a/b/g' file

拆分一下上面的命令:

  • /^sys/ 第一部分,範圍。
  • S 第二部分,命令。
  • a第三部分,匹配。
  • b第四部分,替換字元。
  • g第五部分,flag。

替換模式的引數有點多,但第一部分和第五部分都是可以省略的。替換後會將整個文字輸出出來。

前半部分用來匹配一些範圍,而後半部分執行替換的動作。

第一部分,範圍

這個範圍和上面的範圍語法是一樣的。下面直接看一些例子。

  1. 選擇包含void的行以及後面的3行,並將裡面的void全部替換為int。

    sed '/void/,+3 s/void/int/g' sed-test2.cpp
    
  2. 選擇以void開頭的行和包含CLIENT_TYPE_FLAG_BOTH的行之前的內容,並將裡面的Imuser全部替換為User。

    sed '/^void/,/CLIENT_TYPE_FLAG_BOTH/s/Imuser/User/g' sed-test2.cpp
    
第二部分,命令
  • s也就是substitute的意思。
第三部分,匹配

查詢部分會找到要被替換的字串。這部分可以接受純粹的字串,也可以接受正則表示式。看下面的例子。

  • a 查詢範圍行中的字串a
  • [a,b,c]從範圍行裡查詢字串a或者b或者c。

比如:

sed 's/a/b/g' file	        # 將整個檔案中的字串a替換為字串b
sed 's/[a,b,c]/<&>/g' file  # 將整個檔案中的字串a替換為字串<a>,b替換為<b>,c替換為<c>,下面會解釋
第四部分,替換

是時候把找出的字串給替換掉了。本部分的內容將替換查詢匹配部分找到的內容。

可惜的是,這部分不能使用正則。常用的就是精確替換。比如把a替換成b。

但也有高階功能。和java或者python的正則api類似,sed的替換同樣有Matched Pattern的含義,同樣可以得到Group,不深究。常用的替位符,就是&

&號,再重複一遍。當它用在替換字串中的時候,代表的是原始的查詢匹配資料。

[&] 表明將查詢到的資料使用[]包圍起來。“&” 表明將查詢的資料使用””包圍起來。

下面這條命令,將會把檔案中的每一行,使用雙引號包圍起來。

sed 's/.*/"&"/' file
第五部分,flag引數

這些引數可以單個使用,也可以使用多個,僅介紹最常用的。

  • g 預設只匹配行中第一次出現的內容,加上g,就可以全文替換了。常用。
  • p 當使用了-n引數,p將僅輸出匹配行內容。
  • w 和上面的w模式類似,但是它僅僅輸出有變化的行。
  • i 這個引數比較重要,表示忽略大小寫。
  • e 表示將輸出的每一行,執行一個命令。不建議使用,可以使用xargs配合完成這種功能。

舉例:

sed -n 's/a/b/gipw output.txt' file  # 全域性將a(忽略大小寫)替換為b,並輸出到output.txt檔案

提示:^M就是\r

awk

awksed命令型別,只不過sed擅長取行,awk命令擅長取列。

原理:一般是遍歷一個檔案中的每一行,然後分別對檔案的每一行進行處理。

用法:

awk [可選的命令列選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }'  檔名

列印某幾列
$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI

我們將字串 I love you 通過管道傳遞給awk命令,相當於awk處理一個檔案,該檔案的內容就是I love you,預設通過空格作為分隔符(不管列之間有多少個空格都將當作一個空格處理)I love you就分割成三列了。

假如分割符號為.,可以這樣用

$ echo '192.168.1.1' | awk -F "." '{print $2}'
168
條件過濾

我們知道awk的用法是這樣的,那麼pattern部分怎麼用呢?

awk [可選的命令列選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 檔名

$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87

$2>=90 表示如果當前行的第2列的值大於90則處理當前行,否則不處理。說白了pattern部分是用來從檔案中篩選出需要處理的行進行處理的,這部分是空的代表全部處理。

pattern部分可以是任何條件表示式的判斷結果,例如>,<,==,>=,<=,!=同時還可以使用+,-,*,/運算與條件表示式相結合的複合表示式,邏輯 &&,||,!同樣也可以使用進來。另外pattern部分還可以使用 /正則/ 選擇需要處理的行。

判斷語句

判斷語句是寫在pattern{ 命令 }命令中的,他具備條件過濾一樣的作用,同時他也可以讓輸出更豐富。

$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"優秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 優秀
jack 良好
$ awk '{if($2>=90 )print $0,"優秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 90 95 87 優秀
jack 良好
BEGIN定義表頭
awk [可選的命令列選項] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }'  檔名

使用方法如下:

$ awk 'BEGIN{print "姓名 語文 數學 英語"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 語文數學英語
tom 60 60 60
kitty 90 95 87
jack 72 84 99

這裡要注意,我為了輸出格式好看,做了左對齊的操作(%-8s左對齊,寬8位),printf用法和c++類似。

不僅可以用來定義表頭,還可以做一些變數初始化的工作,例如

$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12

這裡OFMT是個內建變數,初始化數字輸出格式,保留小數點後兩位。

END 新增結尾符

和BEGIN用法類似

$ echo ok | awk '{print $1}END{print "end"}'
ok
end
資料計算
$ awk 'BEGIN{print "姓名 語文 數學 英語 總成績"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","總成績",sum1,sum2,sum3,sumall}'\
 score.txt
姓名 語文 數學 英語 總成績
  tom 60 60 60 180
kitty 90 95 87 272
 jack 72 84 99 255
總成績 222 239 246 707

因為命令太長,末尾用\符號換行。

  • BEGIN體裡輸出表頭,並給四個變數初始化0

  • pattern體裡輸出每一行,並累加運算

  • END體裡輸出總統計結果
    當然了,一個正常人在用linux命令的時候是不會輸入那麼多格式化符號來對齊的,所以新命令又來了
    column -t

    # 使用column 對齊
    $ awk 'BEGIN{print "姓名 語文 數學 英語"} {printf "%s %s %s %s\n", $1, $2, $3, $4}' score.txt | column -t
    姓名   語文  數學  英語
    tom    60    60    60
    kitty  90    95    87
    jack   72    84    99
    
範例:網路狀態統計

執行netstat -ant輸出如下:

$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:2601          0.0.0.0:*               LISTEN
tcp        0      0 172.17.0.1:3306         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2200            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN
tcp        0      0 172.16.115.174:2200     172.16.115.1:2514       ESTABLISHED
tcp        0      0 172.16.115.174:2200     172.16.115.221:50193    ESTABLISHED
tcp        0      0 172.16.115.174:2200     172.16.115.1:2499       ESTABLISHED
tcp        0      0 172.16.115.174:2200     172.16.115.1:2487       ESTABLISHED
tcp        0     36 172.16.115.174:2200     172.16.115.221:54700    ESTABLISHED
tcp        0      0 172.16.115.174:2200     172.16.115.1:2489       ESTABLISHED
tcp6       0      0 :::2200                 :::*                    LISTEN
tcp6       0      0 ::1:5432                :::*                    LISTEN

其中,第6列,標明瞭網路連線所處於的網路狀態。我們先給出awk命令,看一下統計結果。

$ netstat  -ant | 
awk ' \
    BEGIN{print  "State","Count" }  \
    /^tcp/ \
    { rt[$6]++ } \
    END{  for(i in rt){print i,rt[i]}  }'

輸出結果為:

State Count
LISTEN 10
ESTABLISHED 6

假如我們只關心3306埠的連結:

netstat  -ant | 
awk ' \
    BEGIN{print  "State","Count" }  \
    /^tcp/ \
    { if($4=="0.0.0.0:3306" ) rt[$6]++ } \
    END{  for(i in rt){print i,rt[i]}  }' 

檢視*:2200的連結

netstat  -ant |  awk ' \
    BEGIN{print  "State","Count" }  \
    /^tcp.*:2200 / \
    {  rt[$6]++ } \
    END{  for(i in rt){print i,rt[i]}  }'

下面這張圖會配合以上命令詳細說明,希望你能瞭解awk的精髓。

  1. BEGIN 開頭部分,可選的。用來設定一些引數,輸出一些表頭,定義一些變數等。上面的命令僅列印了一行資訊而已。

  2. END 結尾部分,可選的。用來計算一些彙總邏輯,或者輸出這些內容。上面的命令,使用簡單的for迴圈,輸出了陣列rt中的內容。

  3. Pattern 匹配部分,依然可選。用來匹配一些需要處理的行。上面的命令,只匹配tcp開頭的行,其他的不進入處理。

  4. Action 模組。主要邏輯體,按行處理,統計列印,都可以。

注意:

  1. awk的主程式部分使用單引號‘包圍,而不能是雙引號。
  2. awk的列開始的index是0,而不是1。

更進一步學習,參考 https://github.com/Black-Gold/Learn/blob/1ee76ca2a9bbbbfe04850a1ccc9b9658e1eb39de/Linux_man_cn/awk.md