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
    
    [[email protected] 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的行

    [[email protected]] 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

    [[email protected] 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

    [[email protected] 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

    [[email protected] 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
    
    [[email protected] 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
    
    [[email protected] 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:行數,各文件分別計數

    [[email protected] Honeypot-deploy-steps] awk '{print FNR}'  /etc/passwd /etc/issue
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1
    2
    3
    [[email protected] 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:當前文件名;

    [[email protected] 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

    [[email protected] 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
    
    [[email protected] 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/

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

    [[email protected] 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
    
  • 通過管道符操作

    [[email protected] 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
    
    • 格式化輸出

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

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

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

      [[email protected] 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
  • 前言 本文將以 C# 語言來實現一個簡單的布隆過濾器,為簡化說明,設計得很簡單,僅供學習使用。 感謝@時總百忙之中的指導。 布隆過濾器簡介 布隆過濾器(Bloom filter)是一種特殊的 Hash Table,能夠以較小的存儲空間較快地判斷出數據是否存在。常用於允許一定誤判率的數據過濾及防止緩存 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 「簡單有價值的事情長期堅持做」 這是成功最簡單,但也最難學的秘訣。不經過訓練,人很難意識到時間複利的威力。 仙劍奇俠傳的「十里坡劍神」和金庸群俠傳的「十級野球拳」,就是簡單的事情持之以恆反覆做,最後就有巨大的威力 唐家三少成為網文收入第一,最重要的一步是十四年從未斷日更 這樣的案例很多,一開始可能成 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 看你簡歷上面寫著精通MySQL,我先問你事務的特性是什麼? 老生常談,這個還有誰不會背的嗎? 我: ...
  • 基礎知識 python是一門腳本語言,它是解釋執行的。 python使用縮進做為語法,而且python2環境下同一個py文件中不能同時存在tab和空格縮進,否則會出錯,建議在IDE中顯示縮進符。 python在聲明變數時不寫數據類型,可以type(xx)來獲取欄位的類型,然後可以int(),list ...
  • 為什麼要多線程下載 俗話說要以終為始,那麼我們首先要明確多線程下載的目標是什麼,不外乎是為了更快的下載文件。那麼問題來了,多線程下載文件相比於單線程是不是更快? 對於這個問題可以看下圖。 橫坐標是線程數,縱坐標是使用對應線程數下載對應文件時花費的時間,藍橙綠代表下載文件的大小,每個線程下載對應文件2 ...
  • 詳細講解python爬蟲代碼,爬微博搜索結果的博文數據。 爬取欄位: 頁碼、微博id、微博bid、微博作者、發佈時間、微博內容、轉發數、評論數、點贊數。 爬蟲技術: 1、requests 發送請求 2、datetime 時間格式轉換 3、jsonpath 快速解析json數據 4、re 正則表達式提... ...
  • 背景: 一般我們可以用HashMap做本地緩存,但是HashMap功能比較弱,不支持Key過期,不支持數據範圍查找等。故在此實現了一個簡易的本地緩存,取名叫fastmap。 功能: 1.支持數據過期 2.支持等值查找 3.支持範圍查找 4.支持key排序 實現思路: 1.等值查找採用HashMap2 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本章是系列文章的第八章,用著色演算法進行寄存器的分配過程。 本文中的所有內容來自學習DCC888的學習筆記或者自己理解的整理,如需轉載請註明出處。周榮華@燧原科技 寄存器分配 寄存器分配是為程式處理的值找到存儲位置的問題 這些值可以存放到寄存器,也可以存放在記憶體中 寄存器更快,但數量有限 記憶體很多,但 ...