linux awk工具的使用

来源:https://www.cnblogs.com/heyongshen/archive/2022/07/18/16492480.html
-Advertisement-
Play Games

awk的由來 awk這個工具的名字是由三個發明者的首字母組合而成。 awk是一個文本處理工具。 awk的版本 AWK:最早AWK是在unix上實現的,屬於貝爾實驗室的 NAWK:即NEW AWK,是AWK的升級版,也屬於貝爾實驗室。 GAWK:即GNU AWK,基於GNU重新編譯而來的,相容NAWK ...


awk的由來

  • awk這個工具的名字是由三個發明者的首字母組合而成。

  • awk是一個文本處理工具。

awk的版本

  • AWK:最早AWK是在unix上實現的,屬於貝爾實驗室的

  • NAWK:即NEW AWK,是AWK的升級版,也屬於貝爾實驗室。

  • GAWK:即GNU AWK,基於GNU重新編譯而來的,相容NAWK和AWK。

linux使用的是gawk,我們執行的awk是gawk的一個軟連接。

which awk #查看awk這個命令所在的位置
ll /usr/bin/awk #awk是一個軟連接,指向GAWK

awk工作原理

awk是逐行處理文本內容,當awk處理一個文本時,會一行一行進行處理,處理完當前行,再處理下一行,awk預設以”換行符”為標記,識別每一行

會把讀入的一行按照一個的條件分割成列 #預設使用空格作為分隔符

awk的語法格式

格式:
ark [option] 'program' file..
選項:
-F:用於指定分隔符  #例如:-F"|" 表示使用|作為每行的分隔符
-v:用於指定變數

awk的program

awk 的 program 參數由 pattern 和 action 組成。

Pattern 用於指定匹配模式,並對匹配的行執行後面的 action 操作,不匹配的行不做處理。

Action 用於指定要對匹配到的行進行什麼樣的操作,這些操作語句要包含在大括弧 {} 裡面。

如果沒有提供 pattern 參數,預設處理所有行。

program需要用單引號括起來

常見的action動作:print

   pattern省略或為1,等價於 /.*/(任意字元)
   action省略,等價於 { print }
   program就是由pattern和action組成的

awk的工作過程

  • 第一步:BEGIN:在文件處理之前所作的操作

  • 第二步:讀入文件的每一行進行處理

  • 第三步:文件處理完成之後執行END的語句塊

awk program的動作 print

  • print這個動作可以實現列印的功能。

  • 使用分隔符將一行切成若幹列(預設的分隔符:空格),用S1..$n來表示第幾列 $0表示整行

print格式

格式:print item1, item2, ...

逗號作為分隔符

只有一個print動作,預設為:print $0

列印字元串要用雙引號括起來,不然就會認為是要給變數,數字不用加雙引號,變數和數字不需要

範例

例如:獲取分區的利用率
df -h | awk '{print $5}'

df  | awk -F"[ %]+" '{print$1,$5}' #[ %]+:表示以一個以上空格或百分號作為分隔符

例如:取出網站訪問量最大的前3個IP
awk '{print $1}' nginx.access.log-20200428 |sort | uniq -c |sort -nr|head -3

sort命令:實現排序的功能(預設從小到大)
選項:
-n:以字元串的數字作為排序的一句
-r:將要比較的結果反轉 #逆序排序 最大的排最前面

uniq命令:用於去除重覆的行
選項:
-c:在每一行的前面顯示統計改行出現過的次數
-d:僅顯示重覆的行
-u:僅顯示不重覆的行

head命令:顯示文件指定的前幾行
-n num或 -num:顯示文件的開頭num行
例如:獲取指定網卡的ip地址
ifconfig eth0 | sed -n '2p' | awk '{print $2}'

sed命令:對指定的行進行操作,
-n:關閉自動列印功能
腳本位置:
2:表示第二行

腳本指定:
p:表示列印指定的行內容

awk中的變數

  • 內置變數

  • 外置變數

行;稱為記錄

列:稱為欄位或者域

awk的program中引用變數,不需要添加$符號

內置變數

FS:指定欄位的分隔符,相當於-F選項

例如: awk -v FS=":" #指定冒號作為每行分段的分隔符
OFS:指定輸出欄位的分隔符,FS值指定輸入欄位的分隔符。預設的都是空格
NF:欄位數量

NF:一行有多少列

NR:記錄的編號

NR:第幾行的編號,比如第四行,NR就是4

範例:獲取指定網卡的ip地址
ifconfig eth0 | awk 'NR==2{print $2}' #表示取第二行的內容 NR==2就是條件
FNR:對多個文件進行單獨的編號

使用NR的話就是把多個文件合在一起進行編號。
image

FILENAME:當前文件名

自定義變數

自定義變數的格式:-v 變數名=值

awk的PATTERN

pattern(模式)用戶指定需要處理文本的那些行。

  • 沒指定pattern:表示匹配所有

  • 匹配指定的行

  • 匹配一個範圍

不指定pattern
沒有寫pattern:表示空模式,所有的行都匹配(大括弧前面沒任何條件內容)
匹配指定的行:
/正則表達式/:過濾符合正則表達式的行進行列印 --和sed的使用方法一樣的

#範例:ifconfig eth0 | awk '/netmask/{print }' 
匹配一個範圍:
  • 正則表達式寫法

  • 內置變數NR寫法

行的區間範圍:不能直接寫行號,使用NR變數

例如:
NR>=5 && NR <=8 --- 第五行到第八行

正則表達式的寫法: /pattern1/,/pattern2/

awk的操作符

  • 算數操作符

  • 模式匹配符

  • 邏輯操作符

算數操作符:> < == != >= <= % =(賦值)

範例:取奇,偶數行

seq 10 | awk 'NR%2==0'  #能被2整除的就是偶數

seq 10 | awk 'NR%2==1'  #不能被2整除的就是奇數

模式匹配符:

  • ~ 左邊是否和右邊匹配,包含關係

  • !~ 是否不匹配

awk -F: '$0 ~ /root/{print $1}' /etc/passwd  #表示包含root的行

邏輯操作符:

  • 與:&&,並且關係

  • 或:||,或者關係

  • 非:!,取反

例如:
awk -F:  '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd  #第三列大於等於0並且第三列的值小於等於1000

關係表達式:結果為真才進行處理

  • 真:結果為非0值或非空字元串

  • 假:結果為空字元串或0值

例如:
seq 10 | awk '1' #會輸出1到10,因為pattern為1表示為真,而action省略等價於 { print }

seq 10 | awk '0' #什麼都不會輸出,0表示為假

seq 10 | awk '"false"' #會輸出0到10,因為它不是空字元串

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

-Advertisement-
Play Games
更多相關文章
  • 1.簡單介紹java起源: 1995年,詹姆斯-高斯林在sun公司開發出java編程語言.到2010年,sun公司被Oracle公司收購,而詹姆斯-高斯林也離開了Oracle公司.所以,如今想要安轉jdk,需要到Oracle官網下載. 2.jdk的安裝以及環境變數的配置 2.1jdk的下載: 前面提 ...
  • 看《C++ Primer Plus》時整理的學習筆記,部分內容完全摘抄自《C++ Primer Plus》(第6版)中文版,Stephen Prata 著,張海龍 袁國忠譯。只做學習記錄用途。 ...
  • 上一篇文章講到了標簽在 parseDefaultElement 方法中進行解析,本篇文章將講解這部分內容 bean 標簽解析 查看 processBeanDefinition 方法,針對各個操作作具體分析: protected void processBeanDefinition(Element e ...
  • 不要在foreach迴圈里進行元素的remove/add操作。 remove元素請使用Iterator方式,如果併發操作,需要對Iterator對象加鎖。 正例 List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); ...
  • 米哈游2023秋季招聘正式開始~ [燈泡]簡歷投遞:7.4-10.31 提前批: 7.22號之前投遞部分崗位有機會免筆試 筆試:7月-10月 面試:7月中旬開始 [燈泡] 成功密碼 內推碼拿好,沖! 校招唯一專屬內推碼EYTUC。 校招崗位鏈接:https://taou.cn/2piRI 選擇好崗位 ...
  • 1.過濾器 1.為什麼要使用過濾器 在Web開發中,常常會有這樣的需求:在所有介面中去除用戶輸入的非法字元,以防止引起業務異常。要實現這個功能,可以有很多方法,如: 在前端參數傳入時進行校驗,先過濾掉非法字元,然後,返回用戶界面提示用戶重新輸入。 後端接收前端沒有過濾的數據,然後過濾非法字元。 利用 ...
  • 有時為了確保數據存儲的唯一性,會選擇數據結構中的字典,但往往在存儲數據之後會對數據進行一系列的操作,比如排序等等,但字典在數據結構中是通過鍵值對進行存儲的,這時我們可以通過將字典轉換成對應的數組或動態數組進行排序,再通過排序後的鍵獲得字典中的值便可獲得想要的數據了。 引用的空間 using Syst ...
  • 我們作為咨詢方進行全廠的調研,最終給用戶交付《業務現狀分析與信息化需求評估報告》、《信息化總體規劃報告》、《應用架構設計報告》和《候選產品和潛在供應商名單》。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...