linux命令_awk

来源:https://www.cnblogs.com/ivanlee717/archive/2022/05/20/16292056.html
-Advertisement-
Play Games

awk linux命令_sed AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。 之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。 學習具體使用前,先來看下 aw ...


awk

linux命令_sed

AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。

之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。

學習具體使用前,先來看下 awk 能幹些什麼事情:

1. 能夠將給定的文本內容,按照我們期望的格式輸出顯示,列印成報表。

2. 分析處理系統日誌,快速地分析挖掘我們關心的數據,並生成統計信息;

3. 方便地用來統計數據,比如網站的訪問量,訪問的 IP 量等;

4. 通過各種工具的組合,快速地彙總分析系統的運行信息,讓你對系統的運行瞭如指掌;

5. 強大的腳本語言表達能力,支持迴圈、條件、數組等語法,助你分析更加複雜的數據;

……

當然 awk 不僅能做這些事情,當你將它的用法融匯貫通時,可以隨心所欲的按照你的意願,來進行高效的數據分析和統計。

不過我們需要知道,awk 不是萬能的,它比較擅長處理格式化的文本,比如 日誌csv 格式數據等;

awk和sed的區別

sed的核心是正則,對於sed, 基本的兩個概念是匹配和行為。

  1. 匹配是通過區域選擇加上正則表達式實現,比如“3到6行以This開頭的”
  2. 行為是增刪改查。可以在某個位置新增或刪除一行,可以通過正則表達式進行變數替換,可以顯示滿足某些條件的行。配合shell的批處理就會很強大, 比如我想把所有文件的開頭添加一個註釋,比如我想把所有文件的某一個變數進行替換,比如我想把所有文件滿足某些條件的行進行合併和拆分。
  3. 同時,sed提供了一個保持空間(hold space)可以實現逆序輸出等操作。
  4. 另外,sed的用法非常靈活,你可以將匹配和行為進行不同的嵌套,舉個複雜的例子“將第某行到某行之間的滿足A條件的裡面滿足B條件的行進行C操作和D操作並且將E條件的行進行F操作”這樣的靈活組合方式怕是也只有sed了

awk,經常用於格式化輸出,也就是將數據按照我們想要的方式來顯示,並且可以做一些基本的統計工作。

  1. 它的運作模式是“預處理+逐行處理+最終處理”。一般我們只用“逐行處理”比如對於滿足條件的某些行,我們列印某某列。通過指定分隔符,我們很容易的對列進行操作。
  2. 預處理來定義變數,逐行處理來修改變數,最終處理來列印變數。

awk的使用

awk 'BEGIN{ commands } /pattern/ {commands} END{ commands }'

1、BEGIN{ commands }開始塊就是在程式啟動的時候執行的代碼部分,並且它在整個過程中只執行一次。一般情況下,我們可以在開始塊中初始化一些變數。
註意:開始塊部分是可選的,你的程式可以沒有開始塊部分。
2、/pattern/ {commands}pattern 部分匹配該行內容成功後,才會執行commands 的內容。
3 END{ commands }結束塊是在程式結束時執行的代碼。
註意:結束塊部分也是可選的

awk的語法

awk [選項參數] 'script' var=value file(s)
或
awk [選項參數] -f scriptfile var=value file(s)
選項
-F fs or --field-separator fs 指定輸入文件折分隔符,fs是一個字元串或者是一個正則表達式,如-F:。
-v var=value or --asign var=value -va=1賦值一個用戶定義變數a的值為1
-f -f scripfile,從腳本文件中讀取awk命令
-mf nnn and -mr nnn 對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。
-W compact or --compat, -W traditional or --traditional 在相容模式下運行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright 列印簡短的版權信息。
-W help or --help, -W usage or --usage 列印全部awk選項和每個選項的簡短說明。
-W lint or --lint 列印不能向傳統unix平臺移植的結構的警告。
-W source program-text or --source program-text 使用program-text作為源代碼,可與-f命令混用。

awk常用變數

變數 描述
$n $1當前記錄的第1個欄位的內容和sed中的$1不同,sed表示第一個參數
$0 整行數據的內容
FS 欄位分隔符(預設是空格)
OFS 輸出欄位的分隔符(預設是空格)
RS 行分隔符(預設以\n作為一行的結尾),單行分割成多行用到
NR 行號,從1開始,多文件時候也是連續接著計數
FNR 各文件分別計數的行號,多文件的時候會和NR不同,它會重新計數
NF 一行中欄位數量,最後一個欄位內容可以用$NF取出
ARGC 命令行參數的數目
ARGV 包含命令行參數的數組,第一個參數是命令awk

awk格式化

字元 功能
%d 十進位有整數符號
%u 十進位無整數符號
%f 浮點數
%s 字元串
%c 單個字元
%p 指針的值
%e 指數形式的浮點數
%x,%X 無符號以十六進位表示的整數
%0 無符號以八進位表示的整數
%g 自動選擇合適的表示法
\n 換行
\f 清屏並換頁
\t Tab符號
\xhh 表示一個ASCII碼用16進表示,其中hh是1到2個16進位數
\r 回車

示例

awk '{[pattern] action}' {filenames}   # 行匹配語句 awk '' 只能用單引號
awk [選項] '匹配規則和處理規則 ' [處理文本路徑]
標準輸出 | awk [選項] '匹配規則和處理規則 '
BEGIN{} : BEGIN是在awk處理文本之前運行
// : 使用的匹配規則
{} :迴圈(每次只處理一行數據)
END{} :當所有的處理全部執行完畢之後,執行END中的相關操作
  • awk -F: '{print $1}' /etc/passwd
    
    [root@localhost Honeypot-deploy-steps] awk -F: '{print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    games
    ftp
    nobody
    systemd-network
    dbus
    polkitd
    sshd
    postfix
    tss
    postgres
    
  • awk -F: '$3>50{print $0}' /etc/passwd 輸出uid大於50的行

    [root@localhost] awk -F: '$3>50{print $0}' /etc/passwd
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    

    -F[]:指明輸入欄位分隔符; 不使用-F時預設以空格為欄位分隔符

    image-20220520115507876

    [root@localhost Honeypot-deploy-steps] awk '{print $1,$3}'  /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 
    ....
    
  • FS

    [root@localhost Honeypot-deploy-steps] awk  -v FS=":" '{print $1,$3}'  /etc/passwd     輸入時的欄位分隔符
    root 0   
    bin 1
    daemon 2
    adm 3
    lp 4
    sync 5
    shutdown 6
    halt 7
    mail 8
    operator 11
    games 12
    ftp 14
    nobody 99
    systemd-network 192
    
  • RS awk -v RS=" " '{print $0}' /etc/passwd

  • NF

    [root@localhost Honeypot-deploy-steps] awk '{print NF}' /etc/passwd  輸出欄位個數
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    2
    1
    3
    3
    3
    2
    1
    11
    2
    
    [root@localhost Honeypot-deploy-steps] awk '{print $NF}' /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
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    Management:/:/sbin/nologin
    bus:/:/sbin/nologin
    polkitd:/:/sbin/nologin
    SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    daemon:/dev/null:/sbin/nologin
    Server:/var/lib/pgsql:/bin/bash
    
    [root@localhost Honeypot-deploy-steps] awk -F: 'NR > 7 && NR < 14{print NR,$0}' /etc/passwd       輸出第7行之後的內容且第14行之前的內容輸出出來,包含行號
    8 halt:x:7:0:halt:/sbin:/sbin/halt
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10 operator:x:11:0:operator:/root:/sbin/nologin
    11 games:x:12:100:games:/usr/games:/sbin/nologin
    12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13 nobody:x:99:99:Nobody:/:/sbin/nologin
    
    
  • FNR:行數,各文件分別計數

    [root@localhost Honeypot-deploy-steps] awk '{print FNR}'  /etc/passwd /etc/issue
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1
    2
    3
    [root@localhost Honeypot-deploy-steps]# awk '{print FNR,$0}' /etc/passwd /etc/issue
    1 root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6 sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8 halt:x:7:0:halt:/sbin:/sbin/halt
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    1 \S
    2 Kernel \r on an \m
    3 
    
  • FILENAME:當前文件名;

    [root@localhost Honeypot-deploy-steps] awk '{print FILENAME,$0}' /etc/passwd /etc/issue
    /etc/passwd root:x:0:0:root:/root:/bin/bash
    /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
    /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin
    /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin
    /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync
    /etc/passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt
    /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    /etc/passwd operator:x:11:0:operator:/root:/sbin/nologin
    /etc/passwd games:x:12:100:games:/usr/games:/sbin/nologin
    /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin
    /etc/passwd systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    /etc/passwd dbus:x:81:81:System message bus:/:/sbin/nologin
    /etc/passwd polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    /etc/passwd tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    /etc/passwd postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
    /etc/issue \S
    /etc/issue Kernel \r on an \m
    /etc/issue 
    
  • -v

    [root@localhost Honeypot-deploy-steps] awk '{file="passwd";print file,$1}' /etc/passwd 兩種方式是一樣的
    passwd root:x:0:0:root:/root:/bin/bash
    passwd bin:x:1:1:bin:/bin:/sbin/nologin
    passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin
    passwd adm:x:3:4:adm:/var/adm:/sbin/nologin
    passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    [root@localhost Honeypot-deploy-steps] awk -v file="passwd" '{print file,$1}' /etc/passwd
    passwd root:x:0:0:root:/root:/bin/bash
    passwd bin:x:1:1:bin:/bin:/sbin/nologin
    passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin
    passwd adm:x:3:4:adm:/var/adm:/sbin/nologin
    passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    
  • 模式匹配. 讓$1匹配模式/root/

    [root@localhost Honeypot-deploy-steps] awk -F: '$1~/root/{print $7}' /etc/passwd
    /bin/bash
    
  • 條件表達式

    [root@localhost Honeypot-deploy-steps] awk -F: '{$3>=500?usertype="common user":usertype="sysuser or admin";printf "%20s:%-s\n",$1,usertype}' /etc/passwd
                    root:sysuser or admin
                     bin:sysuser or admin
                  daemon:sysuser or admin
                     adm:sysuser or admin
                      lp:sysuser or admin
                    sync:sysuser or admin
                shutdown:sysuser or admin
                    halt:sysuser or admin
                    mail:sysuser or admin
                operator:sysuser or admin
                   games:sysuser or admin
                     ftp:sysuser or admin
                  nobody:sysuser or admin
         systemd-network:sysuser or admin
                    dbus:sysuser or admin
                 polkitd:common user
                    sshd:sysuser or admin
                 postfix:sysuser or admin
                     tss:sysuser or admin
                postgres:sysuser or admin
    
  • 通過管道符操作

    [root@localhost Honeypot-deploy-steps] cat -n /etc/passwd | awk -F: '{print $1}'
         1	root
         2	bin
         3	daemon
         4	adm
         5	lp
         6	sync
         7	shutdown
         8	halt
         9	mail
        10	operator
        11	games
        12	ftp
        13	nobody
        14	systemd-network
        15	dbus
        16	polkitd
        17	sshd
        18	postfix
        19	tss
        20	postgres
    
    • 格式化輸出

      統計第一列字元的最大個數

      [root@localhost Honeypot-deploy-steps] awk -F: 'BEGIN{num=0}{if(length($1)>num){num=length($1)}}END{print num}' /etc/passwd
      15
      

      要求輸出第1列和最後一列,排版整齊

      [root@localhost Honeypot-deploy-steps] awk -F: '{printf "%-15s %s\n",$1,$NF}' /etc/passwd
      root            /bin/bash
      bin             /sbin/nologin
      daemon          /sbin/nologin
      adm             /sbin/nologin
      lp              /sbin/nologin
      

      在前7行前加7, 前14行前加14,其他原樣輸出

      image-20220520134059672

      參考資料

本文來自博客園,作者:ivanlee717,轉載請註明原文鏈接:https://www.cnblogs.com/ivanlee717/p/16292056.html


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

-Advertisement-
Play Games
更多相關文章
  • #Redis簡介 Redis(Remote Dictionary Server)是完全開源的、遵守BSD協議的、高性能的Key-Value資料庫。 Redis與其他Key-Value緩存產品有一下三個特點: Redis支持數據的持久化,可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。 ...
  • 前言 很多人一談到 MSBuild,腦子裡就會出現 “XML”、“只能用 VS 的屬性框圖形界面操作”、“可定製性和擴展性差” 和 “性能低” 等印象,但實際上這些除了 “XML” 之外完全都是刻板印象:這些人用著 Visual Studio 提供的圖形界面,就完全不願意花個幾分鐘時間翻翻文檔去理解 ...
  • 在Word中添加著重號,即強調符號,可以在選中字元後,滑鼠右鍵點擊,選擇“字體”,在視窗中可直接選擇“著重號”添加到文字,用以對重要文字內容起加強提醒的目的,如下圖: 通過C#,我們可以查找到需要添加著重號的字元串,然後通過字元串格式的屬性值來添加符號。下麵,將對此做詳細介紹。 【引入dll】 方法 ...
  • 新創建的 asp.net mvc web api 項目後直接部署到 IIS 中,然後通過另外功能變數名稱 Ajax 跨功能變數名稱調用一個POST介面,並且請求頭headers中增加 Content-Type:application/json,根據阮一峰的文章《跨域資源共用 CORS 詳解》可知道這個非簡單請求會先... ...
  • tmux在連接遠程伺服器做實驗時很有幫助,可以為每一個項目設置一個Session,在Session中設置不同的Window同時跑多個實驗,Window本身還可以分割為多個Pane,在一個視野內利用多個Pane可以更方便地地做對比實驗,或者一邊實驗同時能監視系統的顯存占用,進程信息等狀態。 tmux採 ...
  • 1、修改主機名 方法一# hostname 主機名 ##臨時修改主機名 方法二#vim /etc/hostname ##修改hostname文件重啟系統生效 將localhost.localdomain改為自定的主機名 2、設置sudo給用戶 # vim /etc/sudoers ##編輯sudoe ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 AutoWare.auto 安裝實踐 1. 相關程式版本說明 ubuntu版本:20.04 ADE:4.4.0 Autoware.auto版本(基於ROS2):autoware.auto foxy, ros foxy 2. Docker安裝 以下 ...
  • 引言 最近收到領導通知,甲方需要將原來的伺服器遷移到新的伺服器。 原來的伺服器上安裝了很多的服務,每次重啟之後總是有很多的問題需要人工大量的進行干預。 這次遷移的還是Windows伺服器於是這次打算使用Docker給以後減少點麻煩。 有的項目必須跑在Windows環境中,吐槽。 準備工作 操作系統: ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...