linux三劍客-awk

来源:https://www.cnblogs.com/zeq912/archive/2018/08/22/9519794.html
-Advertisement-
Play Games

第1章 awk指哪打哪 1.1 awk內置變數 FS 輸入欄位(列)分隔符 -F : 相當於-vFS : NR number of record 行號(記錄號) NF number of filed 每行有多少列 OFS output 輸出分隔符 RS record separator 記錄分隔符每 ...


第1章 awk指哪打哪

1.1 awk內置變數

FS 

輸入欄位(列)分隔符

-F :

相當於-vFS :

NR 

number of record 行號(記錄號)

NF  

number of filed  每行有多少列

OFS

output 輸出分隔符

RS 

record separator 記錄分隔符每一的結束標記 預設是回車

IGNORECASE

是否忽略大小寫  1為忽略

1.1.1 RS    記錄分隔符   每一的結束標記預設是回車

[root@zeq files]# cat passwd.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin     預設結束標記是回車,現在文件內容為兩行

以/作為記錄分隔符,顯示行號和文件內容

[root@zeq files]# awk -vRS="/" '{print NR,$0}' passwd.txt   NR是顯示行號   $0是顯示一整行的內容

1 root:x:0:0:root:

2 root:

3 bin

4 bash

bin:x:1:1:bin:

5 bin:

6 sbin

7 nologin               現在以/為記錄分隔符就變成了7行

這裡的awk -vRS="/"     -v給變數賦值,RS是awk內置變數,設置/為記錄分隔符

1.2 awk中表示行和列

NR==1

第一行

$1

第一列

$NF

最後一列

$NF-1

倒數第二列

 

1.3 awk模式匹配(條件)

模式-pattern  幫助你找到想要的行

1)正則表達式

2)比較

   >

   <

   ==

3)範圍

4)BEGIN{} END{}

1.4 正則表達式

~

某一列中包含xxx

!~

某一列中不包含xxx

^

以....開頭的字元(列)

$

以....什麼結尾的

.*

所有

^$

空行

\

轉義字元 backslash  脫掉馬甲打回原形

[]

匹配[]的每一個字元

+

一個字元出現1次或1次以上

|

或者

()

反向引用,一個整體,保護裡面的內容

*

一個字元出現0次或者0次以上

{}

0{n,m} 數字0連續出現了至少n次,最多m次

?

一個字元出現0次或1次

1.4.1 awk正則表達式練習

創建環境

mkdir -p /server/files/

cat >>/server/files/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               第三列是對應的ID號碼

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

1.4.2 取出第3列中以數字4開頭的行

[root@zeq files]# awk '$3~/^4/' reg.txt    $3 第3列   ~ 包括    ^4 以4開頭

Zhang Dandan    41117397   :250:100:175

Liu   Bingbing  41117483   :250:100:175

1.4.3 顯示Xiaoyu的姓氏和ID號碼

[root@zeq files]# awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt  

Zhang 390320151

1.4.4 顯示所有以41開頭的ID號碼的人的全名和ID號碼

[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt

Zhang Dandan 41117397

Liu Bingbing 41117483

awk預設動作

[root@zeq files]# awk  '$3~/^41/' reg.txt

Zhang Dandan    41117397   :250:100:175

Liu   Bingbing  41117483   :250:100:175
[root@zeq files]# awk  '$3~/^41/{print }' reg.txt

Zhang Dandan    41117397   :250:100:175

Liu   Bingbing  41117483   :250:100:175

1.4.5 顯示所有ID號碼最後一位數字是1或5的人的全名

方法1

[root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt     []匹配裡面的1和5    $表示以...結尾

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai
方法2

[root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt     |或者   1或者5

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai

1.4.6 顯示Xiaoyu的捐款.每個值時都有以$開頭.如$520$200$135

[root@zeq files]# awk -F: -vOFS=$ '/Xiaoyu/{print "$"$2,$3,$4}' reg.txt

$155$90$201          -F指定:為分隔符    -vOFS=$輸出$為分隔符   

1.5 awk替換

gsub  awk內置函數

1.5.1 格式  

gsub(/要替換的內容/,"替換成什麼",替換的部分)

1.5.2 接“顯示Xiaoyu的捐款.每個值時都有以$開頭.如$520$200$135”這一題

[root@zeq files]# awk '{gsub(/:/,"$"); print}' reg.txt       把所有的冒號替換成$

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

加上條件精確到哪一部分

[root@zeq files]# awk '$2~/Xiaoyu/{gsub(/:/,"$"); print $NF}' reg.txt     $NF最後一列

$155$90$201

1.6 範圍

1、從第1行到第5行內容

awk  'NR==1,NR==5'

2、從包含某個內容的行到包含某個內容的行

awk  '/內容/,/內容/'

1.6.1 顯示從第1行到第5行內容

[root@zeq files]# awk 'NR==1,NR==5' reg.txt

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

1.6.2 顯示包含Xiaoyu到包含Waiwai的行

[root@zeq files]# awk '/Xiaoyu/,/Waiwai/' reg.txt

Zhang Xiaoyu    390320151  :155:90:201

Meng  Feixue    80042789   :250:60:50

Wu    Waiwai    70271111   :250:80:75

1.7 比較表達式

$5>500                第五列大於500

NR>20                 大於第20行的行,20行以後

>  

>=

==

!=                    不等於

<=

< 

1.7.1 查看磁碟信息 df -h

[root@zeq files]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        19G  7.8G   10G  44% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   61M  120M  34% /boot

/dev/sdb1       193M  1.8M  181M   1% /data

1.7.2 顯示出磁碟使用率大於20%的磁碟分區名稱和掛載點(錯誤範例)

[root@zeq files]# df -h|awk '$5>20{print $1,$NF}'  

Filesystem on

/dev/sda3 /

/dev/sda1 /boot

[root@zeq files]# df -h|awk '$5>9{print $1,$NF}'   這裡會預設$5>9是字元串(字母)而不是比較表達

Filesystem on

1.7.3 解決方法1     指定分隔符只保留數字部分

[root@zeq files]# df -h|awk -F"[% ]+" '$5>9{print $1,$NF}'   

Filesystem on

/dev/sda3 /

/dev/sda1 /boot

想要去掉第一列Filesystem on信息

[root@zeq files]# df -h|awk 'NR>1 && $5+0>9{print $1,$NF}'   第1行以後(&&並且)

/dev/sda3 /

/dev/sda1 /boot

1.7.4 解決方法2    某一列+0

[root@zeq files]# df -h|awk '$5+0>9{print $1,$NF}'    第5列做比較,第5列加0

/dev/sda3 /

/dev/sda1 /boot

1.8 特殊模式 BEGIN{}  END{}

1)awk執行的過程

  1.執行命令的參數(賦值) -F -v

     2.BEGIN{} 裡面的內容 (awk還沒有開始讀取文件內容)

     3.讀取文件內容

        判斷是否滿足條件(模式)

        符合 執行命令(動作)

        不符合  讀取下一行直到最後一行

     4.文件內容讀取完成後,開始執行END{}裡面的內容

 2)BEGIN{}   裡面的內容會在 awk讀取文件內容之前執行

        1.顯示標題

        2.修改awk內置變數 創建變數

           awk 'BEGIN{OFS=:}'  相當於 awk -vOFS=:

        3.測試 計算

3)END{}   awk讀取完文件之後 執行

        顯示計算結果

        先計算,END顯示結果

1.8.1 統計passwd.txt中虛擬用戶的數量

[root@zeq files]# cat passwd.txt         查看文件虛擬用戶為nologin

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

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

統計數量

[root@zeq files]# awk  '/nologin$/{i=i+1}END{print i}' passwd.txt      i=i+1相當於i++

6

1.8.2 統計/etc/services 文件中空行的數量

[root@zeq files]# awk '/^$/{i++}END{print i}' /etc/services

16

1.9 awk動作

print

gsub 函數 (命令)

變數 計算

1.9.1 計算磁碟使用率

[root@zeq files]# df

Filesystem     1K-blocks    Used Available Use% Mounted on

/dev/sda3       19534104 8076500  10458644  44% /

tmpfs             502056       0    502056   0% /dev/shm

/dev/sda1         194241   62009    121992  34% /boot

/dev/sdb1         197209    1813    185003   1% /data
[root@zeq files]# df |awk 'NR>1{print $3/$2}'            

0.413456

0

0.319237

0.00919329

1.9.2 查看記憶體信息   free    free -h

[root@zeq files]# free

             total       used       free     shared    buffers     cached

Mem:       1004112     806016     198096        236     101452     563232

-/+ buffers/cache:     141332     862780

Swap:       786428        420     786008

1.9.3 計算系統記憶體的使用率

[root@zeq files]# free |awk '/Mem/{print ($3-$6-$7)/$2}'

0.140705

[root@zeq files]# free|awk 'NR==3{print $3/($3+$4)}'

0.140705

1.9.4 計算系統記憶體的剩餘率

[root@zeq files]# free|awk 'NR==3{print $4/($3+$4)}'

0.859211

1.9.5 設置變數計算系統記憶體的使用率和剩餘率

 [root@zeq files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}'    sum為變數

0.140765 0.859235

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

-Advertisement-
Play Games
更多相關文章
  • ASP.NET Core的實時庫: SignalR -- 預備知識 ...
  • 記憶體映射數據處理類主要函數及變數如下: 科學數據結構體定義如下: 圖像數據結構體如下: ...
  • PS:之前因為需要擴展了微信和QQ的認證,使得網站是可以使用QQ和微信直接登錄。github 傳送門 。然後有小伙伴問,能否讓這個配置信息(appid, appsecret)按需改變,而不是在 ConfigureServices 裡面寫好。 先上 官方文檔 : https://docs.micros ...
  • 在excel中設置保存之後的編碼格式,需要獲取到Microsoft.Office.Interop.Excel.Workbook然後設置其中的webOpetions的編碼格式就可以了。 在word中設置編碼格式,可以直接在獲取到的Microsoft.Office.Interop.Word.Docume ...
  • 使用iSCSI服務部署網路存儲 iSCSI技術實現了物理硬碟設備與TCP/IP網路協議的相互結合,使得用戶可以通過互聯網方便地訪問遠程機房提供的共用存儲資源.下麵介紹如何在Linux上部署iSCSI服務端程式,並分別給予Linux系統和Windows系統來訪問遠程的存儲資源. 實驗環境 主機名稱 | ...
  • CentOS6.5查看防火牆的狀態: 1 [linuxidc@localhost ~]$service iptable status 1 [linuxidc@localhost ~]$service iptable status 1 [linuxidc@localhost ~]$service ip ...
  • df     df用於顯示文件系統的整體磁碟使用量。 基本用法 其常用選項如下所示: | 選項 | 說明 | | | | | a, all | 顯示所有文件系統,包括/proc等虛擬文件系統 | | h, human readable | 以易讀的形式進行顯示 | | k | 以 ...
  • Ctrl+Alt+(F1-F6):切換虛擬終端 Ctrl+Alt:滑鼠切換界面 $:普通用戶登錄後系統的提示符 #:root用戶登錄後系統的提示符 Linux命令 exit 用於退出目前的shell who 用於顯示系統中有哪些使用者正在上面,顯示的資料包含了使用者ID、使用的終端機、從哪邊連上來的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...