天天看點

Linux文本處理工具AWK使用解析

      在linux系統上有三大文本處理工具分别是:grep,sed,awk,這次主要來看看awk。

awk  option  ‘pattern'  file

-F    指定分隔符;

-v     申明自定義變量;

檢視目前系統上,使用者名和使用者shell,輸出分隔符為~.

# awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}{print $1,$7}END{print "================end============="}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M00/30/68/wKioL1OnkG2Te8bLAAHoqAr3-7g056.jpg" target="_blank"></a>

還可以在中間加入模式(pattern),指定隻對以in字元結尾的行做處理。

# awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}/in$/{print $1,$7}END{print "================end============="}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkOzi04CKAAGVk9MVmA4087.jpg" target="_blank"></a>

顯示目前系統上id号小于等于500的使用者。(表達式比對)

# awk -F: '$3&lt;=500{print $1,$3}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkfTysUq8AADz8_EeYe4797.jpg" target="_blank"></a>

顯示目前系統上shell是/bin/bash的使用者(模式比對)

# awk -F: 'BEGIN{OFS=":";print "UserName  Shell"}$7~/bash/{print $1,$7}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKioL1Onl2bjz1u4AADhHFbpQSY508.jpg" target="_blank"></a>

控制語句:

判斷使用者ID是否為0,如果是就輸出使用者名并說明是一個管理者使用者,如果不是輸出使用者名,說明是一個普通使用者。

# awk -F: '{if ($3==0) {print $1,"Administrator";} else {print  $1,"Common User"}}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/6C/wKioL1OnxgKSOvcjAAFwjsNQKlA986.jpg" target="_blank"></a>

統計下系統上有多少個id号大于500的使用者

# awk -F: -v Sum=0 '{if ($3&gt;=500) Sum++}END{print Sum}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M02/30/6D/wKiom1OnyD6yBqjXAABze-oENBI068.jpg" target="_blank"></a>

顯示number.txt檔案中,是以大于100的數值。

# awk  '{i=1;while (i&lt;=NF) {if ($i&gt;=100) print $i;i++}}' number.txt

<a href="http://s3.51cto.com/wyfs02/M02/30/72/wKioL1On2DPxRUTHAACNMVVAN1k595.jpg" target="_blank"></a>

do-while    至少執行一次循環體,不管條件滿足與否。

# awk -F: '{i=4;do {print $i;i--}while (i&gt;4)}' /etc/passwd

周遊/etc/passwd  $1-$3數值,隻輸出字元數大于4的資料。

# awk -F: '{for(i=1;i&lt;=3;i++){if (length($i)&gt;=4){print $i}}}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/73/wKioL1On3VizB9Q_AACb890E34E218.jpg" target="_blank"></a>

使用for顯示number.txt檔案中,是以大于100的數值。

# awk '{for (i=1;i&lt;=NF;i++){if ($i&gt;=100) {print $i}}}' number.txt

檢視網絡連接配接各個狀态的次數

# netstat -tan | awk '/^tcp/{state[$NF]++}END{for ( S in state) print S,state[S]}'

<a href="http://s3.51cto.com/wyfs02/M01/30/75/wKioL1On5E_AS9BkAAG3w3BNjSI837.jpg" target="_blank"></a>

統計日志每個ip通路了多少次

# awk '{ip[$1]++}END{for ( A  in ip ) print  A,ip[A]}'  access_log

統計目前系統使用者,每種shell各有多少個。

# awk -F: '{count[$NF]++}END{for (A in count )print A,count[A]}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M00/30/76/wKioL1On57PwTWsFAAC6YdjgZnE778.jpg" target="_blank"></a>

awk的内置函數

split        将資料按分隔符切片儲存至數組裡

length     傳回字元串的字元個數

檢視目前每個IP連接配接,與連接配接次數。

# netstat -tan | awk '/:80/{split($5,client,":");IP[client[4]]++}END{for (A in IP) print A,IP[A]}'

<a href="http://s3.51cto.com/wyfs02/M01/30/7C/wKioL1On9P-w0vu2AAFuwWg7z2Y078.jpg" target="_blank"></a>

就是數組和split函數這裡難了

OK完成了

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1429894

繼續閱讀