Linux-awk命令詳解

来源:https://www.cnblogs.com/yanjieli/archive/2018/12/07/10082219.html
-Advertisement-
Play Games

awk 命令詳解 awk 是一種編程語言,用於在linux/nuix下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大的編程工具。它在命令行中使用,但更多是作為腳本來使用。 awk 的處理 ...


awk 命令詳解

  awk 是一種編程語言,用於在linux/nuix下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大的編程工具。它在命令行中使用,但更多是作為腳本來使用。

  awk 的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,併在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。awk分別代表其作者姓氏的第一個字母。因為它的作者是三個恩,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴展。

awk命令兩種使用方式:

  (1)命令行模式:awk [options] 'commands' file(s)

  (2)腳本模式:awk [options] -f scriptfile file[s]

awk 命令模式

awk [options] 'commands' file(s) 

option:
    -F 定義欄位分割符號
    -v 定義變數並賦值
command:
    1、範圍說明或者正則表達式或者{awk命令語句1;awk命令語句2;}
    2、範圍說明部分可以是BEGIN、END、邏輯表達式或者為空
    3、awk命令語句間用分號間隔
    4、引用shell變數時需要用雙引號引起,命令模式都在單引號''裡面
    
    BEGIN{}    {}        END{}
    行處理前     行處理    行處理後

命令格式:
awk 'pattern' filename               示例:awk '/root/' /etc/passwd
awk '{action}' filename              示例:awk -F: '{print $1}' /etc/passwd
awk 'pattern {action}' filename      示例:awk -F: '/root/{print $1,$3}'    /etc/passwd          
示例:awk 'BEGIN{FS=":"} /root/{print $1,$3}' /etc/passwd command |awk 'pattern {action}' 示例:df -P | grep '/' |awk '$4 > 25000 {print $4}'

欄位分割及相關變數

$1,$2,$3...$n:awk中用該順序形式表示files中每行以間隔符號分割的各列的不同欄位
$0             表示文本本身
NF             表示當前記錄的欄位數(列數)
$NF            最後一列
$(NF-1)        倒數第二列
FNR/NR         行號
FILENAME       文件名
"\t"           製表符
RS             換行符
""             列印字元串
FS             定義間隔符
~              匹配,與==相比不是精確比較
!~             不匹配,不精確比較
==             等於,必須全部相等,精確比較
/[0-9][0-9]+/  兩個或兩個以上數字
-F'[:#/]'      定義三個分隔符
# awk -F: '{print $0}' /etc/passwd        //列印文件所有內容
# awk -F: '{print NR, $0}' /etc/passwd /etc/hosts    //列印文件所有內容,並包括行號
# awk -F: '{print FNR,$0}' /etc/passwd /etc/hosts
# awk -F: '{print $0,NF}' /etc/passwd    //保留記錄的欄位數
# awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd    //輸入欄位分隔符,預設為空格

格式化輸出:

print函數
# date |awk '{print "Month: "$2 "\nYear: "$NF}'
# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
# awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd
# head -5 /etc/passwd|awk -F: 'BEGIN {print "user\thomedir\tshell"RS"***********************"};{print $1"\t"$(NF-1)"\t"$NF};END {print"************END************"}
print函數
# date |awk '{print "Month: "$2 "\nYear: "$NF}'
# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
# awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd
參數說明:
    %s 字元類型
    %d 數值類型
    占15字元
    - 表示左對齊,預設是右對齊
    printf預設不會在行尾自動換行,加\n

awk模式和動作

  任何awk語句都由模式和動作組成。模式部分決定動作語句何時觸發及觸發事件。處理即對數據進行的操作。如果省略模式部分,動作將時刻保持執行狀態。模式可以是任何條件語句或複合語句或正則表達式。模式包括兩個特殊欄位 BEGIN和END。使用BEGIN語句設置計數和列印頭。BEGIN語句使用在任何文本瀏覽動作之前,之後文本瀏覽動作依據輸入文本開始執行。END語句用來在awk完成文本瀏覽動作後列印輸出文本總數和結尾狀態。

模式可以是:正則表達式、比較表達式、條件表達式、算術運算符、邏輯操作符和複合模式、範圍模式等。

正則表達式:

匹配記錄(整行):
# awk '/^alice/'  /etc/passwd
# awk '!/root/' passwd

匹配欄位:匹配操作符(~ !~)
# awk -F: '$1 ~ /^admin/'  /etc/passwd
# awk -F: '$NF !~ /nologin$/'  /etc/passwd

比較表達式:

  比較表達式採用對文本進行比較,只有當條件為真,才執行指定的動作。比較表達式使用關係運算符,用於比較數字與字元串。

運算符            含義                            示例
<                小於                            x<y
<=               小於或等於                       x<=y
==               等於                            x==y
!=               不等於                          x!=y
>=               大於等於                        x>=y
>                大於                            x>y
# awk -F: '$3 == 0' /etc/passwd
# awk -F: '$3 < 10' /etc/passwd
# awk -F: '$7 == "/bin/bash"' /etc/passwd
# awk -F: '$1 == "root" ' /etc/passwd
# awk -F: '$1 ~ /admin/ ' /etc/passwd
# df -P | grep  '/' |awk '$4 > 25000'

條件表達式:

# awk -F: '$3>300 {print $0}' /etc/passwd
# awk -F: '{ if($3>300) print $0 }' /etc/passwd
# awk -F: '{ if($3>300) {print $0} }' /etc/passwd
# awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd

算術運算:+ - * / %(模) ^(冪2^3)

可以在模式中執行計算,awk都將按浮點數方式執行算術運算
# awk -F: '$3 * 10 > 500' /etc/passwd

邏輯操作符和複合模式:

&&        邏輯與        a&&b
||        邏輯或        a||b
!         邏輯非        !a
# awk -F: '$3 > 50 && $3 <=100' /etc/passwd
# awk -F: '$3 == 0 || $3 <=10' /etc/passwd
# awk -F: '!($3 == 0 || $3 <=10)' /etc/passwd

awk 腳本編程

條件判斷:

if語句:

//格式
{if(表達式){語句;語句;...}}

# awk -F: '{if($3==0) {print $1 " is administrator."}}' /etc/passwd

# awk -F: '{if($3>0 && $3<1000){count++;}}  END{print count}' /etc/passwd    //統計系統用戶數

if...else語句:

//格式
{if(表達式){語句;語句;...}else{語句;語句;...}}

# awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd

# awk -F: '{if($3==0){count++} else{i++}} END{print "管理員個數: "count ; print "系統用戶數: "i}' /etc/passwd

if...else if...else語句:

//格式
{if(表達式1){語句;語句;...}else if(表達式2){語句;語句;...}else if(表達式3){語句;語句;...}else{語句;語句;...}}

# awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print i; print k; print j}' /etc/passwd

# awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理員個數: "i; print " 普通用個數: "k; print "系統用戶: "j}' /etc/passwd

迴圈:

while:

# awk 'BEGIN{i=1; while(i<=10){print i; i++}  }'
# awk -F: '{i=1; while(i<=10) {print $0;  i++}}' /etc/passwd        //將每行列印10次

for:

# awk 'BEGIN{for(i=1;i<=5;i++){print i} }'                          //C風格for

awk -F: '{for(i=1;i<=10;i++) print $0}' /etc/passwd                 //將每行列印10次

數組:

# awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd
root

# awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd 
bin

# awk -F: '{username[i++]=$1} END{print username[0]}' /etc/passwd 
root

數組遍歷:

# awk -F: '{username[x++]=$1} END{for(i=0;i<x;i++) print i,username[i]}' /etc/passwd

# awk -F: '{username[++x]=$1} END{for(i=1;i<=x;i++) print i,username[i]}' /etc/passwd

# awk -F: '{username[x++]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd

# awk -F: '{username[++x]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd

 練習

1. 統計/etc/passwd 中各種類型shell的數量
# awk -F: '{shells[$NF]++}END{ for(i in shells){print i,shells[i]}}' /etc/passwd

2. 網站訪問狀態統計 <當前時實狀態 netstat>
# netstat -ant |grep :80 |awk '{access_stat[$NF]++}END{for(i in access_stat){print i, access_stat[i]}}'
# netstat -ant |grep :80 |awk '{access_stat[$NF]++} END{for(i in access_stat ){print i,access_stat[i]}}' |sort -k2 -n |head
# ss -an |grep :80 |awk '{access_stat[$1]++} END{for(i in access_stat){print i,access_stat[i]}}'
# ss -an |grep :80 |awk '{access_stat[$1]++} END{for(i in access_stat){print i,access_stat[i]}}' |sort -k2 -rn

3. 統計當前訪問的每個IP的數量 <當前時實狀態 netstat,ss>
# ss -an |grep :80 |awk -F":" '!/LISTEN/{ip_count[$(NF-1)]++} END{for(i in ip_count){print i,ip_count[i]}}' |sort -k2 -rn

4. 統計Apache/Nginx日誌中某一天的PV量  <統計日誌>
# grep '07/Aug/2012' access.log |wc -l

5. 統計Apache/Nginx日誌中某一天不同IP的訪問量 <統計日誌>
# grep '07/Dec/2018' access.log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn
# grep '07/Dec/2018' access.log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |awk '$2>100' |sort -k2

6. awk函數 統計用戶名為4個字元的用戶
# awk -F: '$1~/^....$/{count++; print $1} END{print "count is: " count}' /etc/passwd
# awk -F: 'length($1)==4{count++; print $1} END{print "count is: "count}' /etc/passwd

7. 取得網卡IP(除ipv6以外的所有IP)
# ifconfig |awk '/[ ]inet[ ]/{print $2}'

8. 獲得記憶體使用情況
# free -m |awk 'NR==2{print $3*100/$2}'

9. 獲得磁碟使用情況
# df |awk '/\/$/{print $5}'

10. 清空本機的ARP緩存
# arp |awk '!/Address/{print "arp -d " $1}'|bash
# arp -n |awk '/^[0-9]/{print $1}' |xargs -I {} arp -d {}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如今,基於Web版的Office 線上預覽與編輯功能已成為一種趨勢,而關於該技術的實現卻成為了國內大部份公司的技術挑戰,挑戰主要存在於兩方面: 其一:目前國內乃至微軟本身,還沒有相對較為完善的解決方案 其二:對於開發人員來說,可查詢資料甚少,即使翻牆,資料也甚少 基於如上的難點與挑戰,國內規模相對較 ...
  • LeaRun是一款基於.net的敏捷開發框架,框架內置角色、表單、工作流、嚮導式智能開發組件、即時通訊組件、APP開發組件、微信組件、通用許可權等一系列組件,軟體開發人員可以通過一系列簡單配置快速開發出OA、ERP、CRM、HRM、SAAS、MIS、移動APP、微信等眾多高質量信息系統。 官網lear ...
  • 下麵是treeview的用法TreeView組件是由多個類來定義的,TreeView組件是由命名空間"System.Windows .Forms"中的"TreeView"類來定義的,而其中的節點(即Node),是由命名空間"System.Windows .Forms"中的"TreeNode"來定義的 ...
  • 一、簡介 Aztec Code是1995年,由Hand HeldProducts公司的Dr. Andrew Longacre設計。它是一種高容量的二維條形碼格式。它可以對ASCII和擴展ASCII碼進行編碼。當使用最高容量和25%的糾錯級別的時候,Aztec可以對3000個字元或者3750個數字進行 ...
  • 前提: 需要nuget Swashbuckle.AspNetCore 我暫時用的是 4.01 最新版本; 描述:解決 .net core webapi 上傳文件使用的是 IFormFile,在Swagger 介面描敘的時候很不友好,為解決介面文檔的友好描敘; 實際效果: 解決辦法: 步驟1 增加 S ...
  • [TOC] 介紹 檢測伺服器當前的性能,主要檢查的項目如下: 負載:uptime 內核信息: dmesg 記憶體:vmstat、free CPU:top、mpstat、 I/O:iostat 網路:sar 有些命令需要安裝sysstat包 負載:uptime 通過 命令可以快速的查看當前的伺服器的1分 ...
  • 安裝某virtual無法written,某博主指引替換system32下的uxtheme.dll重啟即可。照做後重啟…桌面沒了,只能看見堅強的某鳥壁紙。無奈,重啟,採用最近一次的正確配置等…無果;求助各路大牛:“系統文件都敢替換,hhhh……”,無語,問度娘:如果安全模式跟恢復正確配置都不行就重裝系 ...
  • 摘要 網上一些激活工具可能捆綁了木馬、病毒。使用激活工具有風險。使用線上KMS來激活系統則沒有這個風險。(自測至發佈日期仍然可用) (有能力的請支持正版windows系統) 將kms伺服器地址設置為kms.03k.org(線上可用的KMS伺服器都可以) 已管理員身份運行CMD輸入命令:slmgr / ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...