文本處理三劍客之 awk

来源:https://www.cnblogs.com/flashfish/archive/2019/04/17/10724614.html
-Advertisement-
Play Games

GAWK:報告生成器,格式化文本輸出 awk [options] ‘program’ var=value file… awk [options] -f programfile var=value file… awk [options] 'BEGIN{ action;… } pattern{ acti ...


GAWK:報告生成器,格式化文本輸出

    awk [options] ‘program’ var=value file…
    awk [options] -f programfile var=value file…
    awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...

  awk程式組成部分:

    BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊

    選項:

      -F:指明輸入時用到的欄位分割符;
      -v var=value:自定義變數
      -f:指定awk腳本,從腳本中讀取program

    基本格式:

      awk [options] 'program' file...

      program:pattern{action statements;...}  通常在單引號或雙引號中;
      pattern與action:
        pattern部分決定動作語句何時觸發及事件
          BEGIN:模式匹配之前要執行的動作

          END:模式匹配結束之後要執行的動作

        action statements對數據進行處理,放在{}內指明;
          print  $0,$!.......$(NF-1)........$NF(最後一列)

    分隔符,域,記錄

      awk執行時,由分隔符分隔的欄位(域)標記$1,$2...$n稱為域標識。$0為所有域。
      文件的每一行稱為記錄;
      省略action,則預設執行print $0的操作;

 

awk的工作原理:

  1)、執行BEGIN{action;...}語句塊中的語句;
  2)、從文件或標準輸入(stdin)讀取一行,然後執行pattern{action;...}語句塊,它會逐行掃描文件,從第一行到最後一行重覆這個過程,知道文件被全部讀取完畢;
  3)、當讀至輸入流末尾時,執行END{action;...}語句塊

  BEGIN語句塊:在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變數初始化、列印輸出表格的表頭等語句通常 可以寫在BEGIN語句塊中。

  END語句塊:在awk從輸入流中讀取完所有的行之後即被執行,比如 列印所有行的分析結果這類信息彙總都是在END語句塊中完成它也是一個可選語句塊

  pattern語句塊中的通用命令是最重要的部分,也是可選的。如果 沒有提供pattern語句塊,則預設執行{ print },即列印每一個讀取到的行,awk讀取的每一行都會執行該語句塊

 

    print格式:print item1,item2,...
      1)、逗號為分隔符;
      2)、輸出的個item可以是字元串,也可以是當前記錄的欄位、變數或awk的表達式;
      3)、如省略item,相當於print $0;

     awk '{print "hello,awk"}'
     awk –F: '{print}' /etc/passwd         # -F指定分割符為  :冒號
     awk –F: '{print “wang”}' /etc/passwd 
    

    awk –F: '{print $1}' /etc/passwd     awk –F: '{print $0}' /etc/passwd     awk –F: '{print $1”\t”$3}' /etc/passwd     tail3 /etc/fstab |awk '{print $2,$4}'

    變數:

      FS:輸入欄位分隔符,預設為空白字元;

      awk -v FS=':' '{print $1,FS,$3}' file

      

      OFS:輸出欄位分隔符,預設為空白字元;指定輸出時的分隔符是什麼,一般可以進行分隔符號替換,類似下麵的ORS的作用

      awk -v FS=':' -v OFS=':' '{print $1,$2,$3}' file
      

      [root@mysql-141 ~]# awk -v FS=':' -v OFS='#' '{print $1,$2,$3}' /etc/passwd
      root#x#0
      bin#x#1
      daemon#x#2
      adm#x#3

     

      RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效;

      awk -v RS=' ' '{print}' file

      

      ORS:輸出記錄分隔符,輸出時用指定符號代替換行符;

      awk -v RS=' ' -v ORS='$$$' '{print}' file

      

      NF:欄位數量

      awk -F: '{print NF}' file
      awk -F: '{print $(NF-1)}' file
      # 顯示文件的第一列,第三列,倒數第二列和最後一列

        [root@mysql-141 ~]# awk -F : '{print $1,$2,$(NF-1),$NF}' /etc/passwd
        root x /root /bin/bash
        bin x /bin /sbin/nologin
        daemon x /sbin /sbin/nologin
        adm x /var/adm /sbin/nologin

      

      NR:行號

      awk -F: '{print NR,$1}' file   # 與FNR類似
      awk END'{print NR}' file
      

      [root@mysql-141 ~]# awk END'{print NR}' /etc/passwd  #將文件內容讀取完成之後,統計行數
       26

      awk 'NR==2,NR==6{print NR,$0}}' file  #顯示文件2-6行

      

      FNR:各文件的行號分別計數;

      awk -F: '{print FNR,$1}' file1 file2...

      [root@mysql-141 ~]# awk -F: '{print FNR,$1}' /etc/passwd
      1 root
      2 bin
      3 daemon
      4 adm
      5 lp
      6 sync
      7 shutdown
      8 halt

      

      FILENAME:當前文件名;文件內容有多少行,awk就會輸出多少行

     awk '{print FILENAME}' FILE1 FILE2...

      [root@mysql-141 ~]# awk '{print FILENAME}' /etc/passwd |wc -l
      26
      [root@mysql-141 ~]# wc -l /etc/passwd
      26 /etc/passwd

      

      ARGV:數組,保存的是命令行所給定的各參數;

      awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab 
      awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
      

      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab      # 相當於shell裡面的$1 $2 $3 的概念
      /etc/fstab
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/inittab
      /etc/inittab
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
      awk
      [root@mysql-141 ~]# awk 'BEGIN {print ARGV[3]}' /etc/fstab /etc/inittab

 

    算術操作符:
      x+y x-y x*y x/y x^y x%y
      -x:轉換為負數;
      +x:轉換為數值,變數通過+連接運算,自動強制將字元串轉為整形,非數字變成0,發現第一個非數字字元,後面的自動忽略;

字元串操作符:沒有符號的操作符,字元串連接
    賦值操作符:
      

      =    +=    -=     *=      /=      %=     ^=      ++      -- 

    比較操作符:
      

      ==   !=   >    >=    <    <=

 

    模式匹配符:
      ~:左邊的內容是否被右邊的模式包含匹配

       !~:是否不匹配;

     [root@mysql-141 ~]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd    # 以:為分隔符,匹配全部內容包含root的行,列印第一列

       root
       operator

      [root@mysql-141 ~]# awk '$0 ~ "^root"' /etc/passwd       # 匹配所有內容,期初以root開頭的行
       root:x:0:0:root:/root:/bin/bash  

      [root@mysql-141 ~]# awk -F: '$3==0' /etc/passwd        # 匹配以冒號為分隔符,第三列是0的行
      root:x:0:0:root:/root:/bin/bash

 

cat >>/tmp/reg.txt<<EOF
Zhang    Dandan        41117397    :250:100:175
Zhang    Xiaoyu        390320151    :155:90:201
Meng    Feixue        80042789    :250:60:50
Wu    Waiwai        70271111    :250:80:75
Liu    Bingbing    41117483    :250:100:175
Wang    Xiaoai        3515064655    :50:95:135
Zi    Gege        1986787350    :250:168:200
Li    Youjiu        918391635    :175:75:300
Lao    Nanhai        918391635    :250:100:175
EOF

    操作符:

      與&&

       或||

       非!

示例:

[root@mysql-141 ~]# awk -F : '$3>=0 && $3<=1000 {print $1}' /etc/passwd
root
bin
daemon
adm
lp

[root@mysql-141 ~]# awk -F : '$3==0 || $3>=1000 {print $1}' /etc/passwd
root

 

[root@mysql-141 ~]# awk -F : '!($3==0) {print $1}' /etc/passwd
bin
daemon
adm
lp

[root@mysql-141 ~]# awk -F : '!($3>=500) {print $3}' /etc/passwd
0
1
2
3
4
5
6


    awk PATTERN:
      1)、如果未指定:空模式,匹配每一行;
      2)、/regular expression/:僅處理能夠被模式匹配到的行,需要用//括起來;

awk '/^UUID/{print $1}' /etc/passwd
awk '!/^UUID/{print $1}' /etc/passwd

      3)、relational expression:關係表達式,結果未"真"才會被處理;
        真:結果為非0值,非空字元串;
        假:結果為空字元串或0值;

awk -F : 'i=1;j=1{print i,j}' /etc/passwd 
awk '!0' /etc/passwd ; awk '!1' /etc/passwd 
awk –F : '$3>=1000{print $1,$3}' /etc/passwd 
awk -F : '$3<1000{print $1,$3}' /etc/passwd

[root@mysql-141 ~]# awk -F : '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
lipeng /bin/bash

[root@mysql-141 ~]# awk -F : '$NF ~ /nologin$/{print $1,$NF}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
mail /sbin/nologin
uucp /sbin/nologin

      4)、line ranges:行範圍:
        startline,endine:/pat1/,/pat2/ 不支持直接給出數字格式:

[root@mysql-141 ~]# awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd 
root
bin
daemon
adm
lp
nobody
[root@mysql-141 ~]# awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
10 uucp
11 operator
12 games
13 gopher
14 ftp

  awk數組概念:

預備知識: 瞭解兩種awk運算方法
    1) 累加運算 1+1+1
      i=i+1 i初始狀態為0
      i++
      eg: 統計/etc/services文件中空行數量

      第一個裡程: 找出文件中空行信息
      awk '/^$/' /etc/services

      第二個裡程: 統計空行數量
      awk '/^$/{i=i+1;print i}' /etc/services

PS: awk中所有字元串信息都會識別為變數名稱信息, 調取變數是不需要加上$符號
awk中想顯示指定字元串信息, 需要在字元串外面加上雙引號信息

[root@oldgirl ~]# awk '/^$/{i=i+1;print i}' /etc/services
1        #  i=i+1 i=0 i=0+1 --> i=1 
2     #  i=i+1 i=1 i=1+1 --> i=2
3     #  i=2 i=2+1 --> i=3
4
5
6
7
8
9
10
11
12
13
14
15
16

[root@oldgirl ~]# awk '/^$/{i=i+1}END{print i}' /etc/services  # 將文件內容載入完之後,做出統計 16

 

    2) 求和運算 10+20+5
       i=i+$n i的初始狀態為0   $n取第幾列數值信息

[root@oldgirl ~]# seq 10|awk '{i=i+$0;print i}'
1 i=i+$0 i=0 $0=1 i=0+1 -- 1 1 
2 i=i+$0 i=1 $0=2 i=1+2 -- 3 3 
3 i=i+$0 i=3 $0=3 i=3+3 -- 6 6
4 10
5 15
6 21
7 28
8 36
9 45
10 55

  [root@mysql-141 ~]# seq 10|awk '{i=i+$0;print i}'
    1
    3
    6
    10
    15
    21
    28
    36
    45
    55

    3). 數組的表現形式       

        數組中的括弧裡面的內容

        hotel[元素01]=xiaolizi1  --- 調用print xiaolizi1[元素01]--- xiaolizi1
        hotel[元素02]=xiaolizi2 --- 調用print xiaolizi2[元素02]--- xiaolizi2

      數組統計命令組成說明:
      1) 找出要統計的信息
        $1

      2) 把指定要統計信息作為數組的元素
        h[$1]

      3) 利用統計運算公式,進行運算
        h[$1]=h[$1]+1 --- i=i+1

      4) 顯示運算的結果信息
        a 只看某一個元素的結果信息

     awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"]}' access.log 
     5

        b 要看全部元素的結果信息
         

     awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"],h["114.94.29.165"]}' access.log 
      
# 精簡後命令
      awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log 

 


    for name in 101.226.61.184 114.94.29.165
      print h[$name]

      ==>
    for(name in h) --- > echo name=h=第一個元素信息
    echo name=h=第二個元素信息

說明: 迴圈中讀取數組名稱==讀取每一個元素名稱信息

cat >>url.txt<<EOF
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
EOF
awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log 

  

[root@mysql-141 ~]# awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log
101.226.61.184 5
27.154.190.158 2
218.79.64.76 2
114.94.29.165 1


第一步: 定義數組信息
awk '{h[$1]}' access.log 
說明: 數組中的元素就是你關註要統計的列的信息

第二步: 進行統計運算,編寫公式
awk '{h[$1]=h[$1]+1}' access.log 

第三步: 編寫元素迴圈信息
awk '{h[$1]=h[$1]+1}END{for(name in h)}' access.log

第四步: 輸出結果信息    
awk '{h[$1]=h[$1]+1}END{for(name in h) print name,h[name]}' access.log 

 


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

-Advertisement-
Play Games
更多相關文章
  • 在C#中值類型都是由System.ValueType的直接派生類,System.ValueType本身又是直接從System.Object派生的。派生的意思是‘利用繼承機制,新的類可以從已有的類中生出來‘。簡單點就是‘粑粑生娃’。有時是‘爺爺生娃‘例如:枚舉都從System.Enum抽象類派生,而後 ...
  • 數組是對相同類型的一組數據的封裝。數組定義的時候,要說明是對哪一種類型的封裝,並且要指定長度。 運行結果如下: 數組是一種數據類型,並且二維數組在圖像處理中會應用。一維數組的起始下標是[0]。二維數組的起始下標是[0,0]。交錯也稱參差數組的起始下標是[0][0]。 數組一定是固定長度和類型確定並且 ...
  • 本示例演示DS開放式下拉列表控制項中加入一個RDP遠程桌面控制項。 先在VS工具箱中添加COM控制項Microsoft RDP Client Control,後面的Version版本可以適當高點。 然後將RDP控制項拖到窗體中,再拖出一個DS開放式下拉列表控制項。 編寫代碼: 運行後,點擊DS開放式下拉列表控 ...
  • 今天回到家,突然發現用了兩年的win7系統藍屏了,不想浪費時間在排查原因上,就直接拿出winpe重新安裝了一個win10企業版LTSC,安裝完驅動後傻眼了,這個時候我才發現,激活它是件很不容易的事。 前前後後用了好幾款激活工具,什麼暴風、小馬,還有其它一大堆亂七八糟的玩藝兒,根本不管用,最後才發現這 ...
  • 簡介 Schema.xml 作為 MyCat 中重要的配置文件之一,管理著 MyCat 的邏輯庫、表、分片規則、DataNode 以及 DataSource。弄懂這些配置,是正確使用 MyCat 的前提。這裡就一層層對該文件進行解析。 schema 標簽 schema 標簽用於定義 MyCat 實例 ...
  • 目錄 1. "前言" 1. "環境" 1. "安裝說明" 1. "安裝" "1、mycat" "2、mycat eye" 前言 介紹自己看。 mycat官網:http://www.mycat.io/ 環境 系統: SUSE12SP3 軟體| 版本|說明| | | java|jdk1.7.0_79|其 ...
  • 通過yum命令只下載rpm包不安裝 經常遇到伺服器沒有網路的情況下部署環境,或者創建自己的 yum 倉庫等。每次都是在網上搜搜搜,都是五花八門,自己整理了下自己用到的以下三種方式,這裡沒有太多廢話,只是如何安裝並示例經常用到的方式,如果還需要更多參數 ,可以通過 --help 查看手冊: 方法一:y ...
  • 此博文是CentOS 7 在最小化安裝之後進行安裝Apache服務的操作步驟,httpd版本為httpd-2.4.34。 一、基本服務環境搭建 安裝apache需要的基本環境:apr apr-util pcre gcc gcc-c++ expat-devel Yum install -y gcc g ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...