Linux--shell的awk--10

来源:https://www.cnblogs.com/gxnihao/archive/2019/08/27/11419882.html
-Advertisement-
Play Games

一、awk介紹 全稱:由Aho Weinberger Kernaighan三個人的首字母組合而成 1970年第一次出現在Unix機器上,後來在開源領域使用它 awk是一種單獨的編程語言解釋器 awk報告生成器:通過模式匹配以及自己本身的語言格式,來獲取並輸出客戶所需要的內容 示例:獲取系統上面用戶i ...


一、awk介紹

全稱:由Aho Weinberger Kernaighan三個人的首字母組合而成

1970年第一次出現在Unix機器上,後來在開源領域使用它

awk是一種單獨的編程語言解釋器

awk報告生成器:通過模式匹配以及自己本身的語言格式,來獲取並輸出客戶所需要的內容

示例:獲取系統上面用戶id大於1小於等於500的用戶的用戶名和用戶ID

awk -F: '{if($3>=1&&<=500){print $1,$3}}' /etc/passwd

二、awk工作原理

1、依次把匹配到的行,使用awk工具進行編輯

2、$0表示整行,$1代表第一個…,$NF代表最後一個

3、pattern;通過模式匹配對應的欄位過濾行;

4、通過對應的命令 printf 做格式化輸出

三、awk用法

 awk [option] … 'program' FILE

註意:

1、program 必須使用單引號

2、多條program語句使用大括弧包含起來,可以併列、嵌套    

awk '{print}' /etc/passwd   #預設列印$0

四、awk常見選項(option)

-F  指定分隔符,預設是空格

  -F[:\] 指定多個分隔符

例:
awk -F[:\] '{print $3,$5,$7}' /etc/passwd   指定 : 和 / 為分隔符

-v  手動指定變數參數

awk -v a="a/b" 'print a' a.txt

  1、a是自定義變數

  2、在awk中調用變數不用加$符號

cut與awk的區別

  awk 以空格為分割域時,是以單個或多個連續的空格為分隔符的;

cut則是以單個空格作為分隔符。

五、awk的語法格式----program

1、print

預設輸出(在屏幕上)

在awk中沒有保存命令,我們可以關聯其他命令(tee)來保存

2、printf  實現格式化輸出

輸出格式:printf  "xxx %-10s xxx %-10d ",name,num 

格式符:

  %s   顯示字元串

  %d %i  顯示數值

  %c   顯示ASCII

  %e %E 科學計算方式

  %f    顯示浮點數

  %u  無符號整數

  %%   逃逸符,只顯示%自己

修飾符:

  預設為右對齊

  -        代表左對齊

    %5.4f  代表占位數為5,小數位有4位  

3、變數

內置變數----環境變數(bash)

  awk語言所預設支持的變數

  FS   定義輸入分隔符的變數

  OFS  定義輸出分隔符的變數

  NF($NF) 分割以後的最後一列的變數,變數引用的時候不用加$

  NR  定義文件的行數,定義多個文件的時候,行號疊加

  FNR 定義文件行數時,只計算自己的行號

  FILENAME  存儲文件名字

  BEGIN  只執行一次後面的命令

awk 'BEGIN{print "xxx"}{print$3}' /etc/passwd

  ARGC  整個 命令參數 的段數  不包含ARGC命令本身

  ARGV  用來調取命令中指定的段

awk '{print ARGC}' /etc/passwd       ==  2
awk '{print ARGV[2]}' /etc/passwd    == /etc/passwd

  RS  指定換行符,預設為\n,可以指定新的換行符,不影響預設符號

  ORS  輸出時替換預設換行符

awk -v ORS="@" '{print}' /etc/passwd

  自定義變數

    -v 變數=值

在後面’program’中去調用自定義變數時,直接使用即可或者將”變數=值”語句寫到program即可

4、模式匹配(地址定界)

a) 空值,沒有定義,預設就將文件中所有行放入awk中進行迴圈

b) 對m~n行進行操作

awk 'NR>=1&&NR<=3{print}' /etc/passwd     列印1到3行

c) pattern匹配的行 /pattern/

awk '/r..t/{print}' /etc/passwd

d) /pattern1/,/pattern2/ 第一次pattern1到第一次匹配pattern2的行

awk '/root/,/user1/{print}' /etc/passwd

練習:判斷/patern1/,/pattern2/之間行的用戶是bash用戶,並顯示用戶名

awk -F: '/^root/,/user1/{if($NF=="/bin/bash");print $1,$3}' /etc/passwd

e) 模式匹配可以直接使用判斷語句

awk -F: '$NF=="/bin/bash"{print $1 $3}' /etc/passwd

f) BEGIN定義在預設迴圈進行操作前所要執行的語句

awk -F: 'BEGIN{printf "shell程式為bash:\n"}$NF=="/bin/bash"{print $1,$3}' /etc/passwd

g) END 定義在迴圈結束後執行

awk -F: $NF=="/bin/bash"{print $1,$3} 'END{printf "end\n"}' /etc/passwd

5、操作符

運算操作符

  +  -  *  /  %  ^(乘方)  //

比較運算符

  >  <  ==  !=  >=  <=  ~(等於)  !~

awk -F: '-FS~"/bin/bash" {print $1,$3}' /etc/passwd

邏輯操作符

  &&  ||  !

賦值操作符

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

條件表達式

  條件語句? 條件成立語句;條件不成立語句

awk '/^title/{NF<=2? print; print "參數過少"}' /boot/grub/grub.conf

6、常見action

  print printf 以及它任何命令的操作都是action

a) expressions

b) input statements輸入語句

c) 組合語句 compound statements /pat1/{{ }{ }}

d) control statements 控制語句 例如 if  while等

e) output statements 輸出語句

7、常見語言

a) if語句

  語法格式:if(條件表達式){執行語句} else {執行語句}

awk '/^title/{if(NF<=2){print} else {print "error"}}' /boot/grub/grub.conf

b) while語句

  只有對行參數進行遍歷的時候才使用while語句

  語法格式:初始值 while(條件表達式){迴圈體;初始控制語句}

c) for語句

  語法格式:for(初始值;條件判斷;初始值控制語句){迴圈體}

d) do-while語句

  語法格式:do {迴圈體} while (迴圈條件)

e) 跳出迴圈語句

  break [n]  跳出n次迴圈

  continue  跳出本次迴圈

  next      跳出預設的當前迴圈  NR%2==1 next 跳過奇數行

awk '{if(NR%2==1){next}else{print}}' /etc/passwd

f) switch語句(類似case)

  語法格式:switch(表達式){case 模式匹配值:執行語句;case …,default:執行語句}

8、數組

在awk中,數組和shell中的數組特性相同

註意:awk中數組不用定義,只要使用,就有值為空的預設數組

行遍歷:整個文件進行遍歷

列遍歷:取對象的某一列進行遍歷

註意:數組通過for語句,再給其他變數進行賦值時,賦的是索引信息

練習統計/etc/fstab中每個單詞(以空格隔開的詞)的次數

awk -v RS=" " '{print}' /etc/fstab | awk '{a[$1]++}END{for(i in a){printf "%-50s = %-2d\n",i,a[i]}}'

9、函數

內置函數:

  length()  統計字元串長度

    數學上使用的函數 sin() cos() tan() …

  sub(x,x,x)  替換第一個匹配到的值

awk -F: '{print sub(o,O,$1) }' /etc/passw第一列第一個o替換為O

  gsub(x,x,x)  替換該行所有匹配到的所有值

awk -F: '{print gsub(o,O,$1) }' /etc/passwd第一列所有o替換為O

  split(x,x,x)  指定分隔符去切割文件

netstat -tan | awk '/^tcp\>/{split($5,ip,":");print ip[1]}'

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

-Advertisement-
Play Games
更多相關文章
  • 閱讀目錄 數值類型 日期時間類型 字元串類型 ENUM和SET類型 "返回頂部" 數值類型 MySQL支持所有標準SQL數值數據類型。 這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PREC ...
  • 主鍵就是一個表中每個數據行的唯一標識。不會有重覆值的列才能當主鍵。一個表可以沒有主鍵,但是會非常難以處理,因此沒有特殊理由表都要設定主鍵 主鍵有兩種選用策略:業務主鍵和邏輯主鍵。業務主鍵是使用有業務意義的欄位做主鍵,比如身份證號、銀行賬號等;邏輯主鍵是使用沒有任何業務意義的欄位做主鍵,完全給程式看的 ...
  • 目 錄 1. 概述... 2 2. 使命及目標... 3 3. 系統框架... 4 4. 設備容器(iNeuKernel)... 4 5. 第三方數據導入介面... 9 6. 視圖建模(iNeuView)... 10 7. 機器學習(iNeuAI)... 11 8. 徵集需求... 13 1. 概述 ...
  • 本文將通過實際的例子來演示如何在ASP.NET Core中應用JWT進行用戶認證以及Token的刷新方案(ASP.NET Core 系列目錄) 一、什麼是JWT? JWT(json web token)基於開放標準(RFC 7519),是一種無狀態的分散式的身份驗證方式,主要用於在網路應用環境間安全 ...
  • 實際的生產環境中,總會做一些定期的任務,比如數據備份,我們不可能總等到那個時間去手動執行,這時計劃任務就派上用場了。 ...
  • Windows 有任務管理器來管理進程,Linux 也有相應的命令來管理進程。 ...
  • Linux伺服器線上打包遇到的問題 轉載請標明出處: "https://dujinyang.blog.csdn.net/article/details/80110942" 本文出自:【奧特曼超人的博客】 線上打包的流程 遇到奇怪的BUG(Linux apktool 包體變大) 1. 線上打包的流程 ...
  • 如何控制服務的運行狀態?如何切換不同的運行級別? 服務控制 ntsysv 仿圖形交互界面,集中配置各種服務啟動狀態 :同時對指定運行級別中的服務進行管理,不加僅管理當前運行級別中的服務。 systemctl systemctl {選項} name.servive :啟動 :停止 :重啟,先停止,再啟 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...