文本三劍客---gawk基礎

来源:http://www.cnblogs.com/Sunzz/archive/2017/07/25/7232058.html
-Advertisement-
Play Games

gawk 程式是Unix中原始awk程式的GNU版本。gawk程式讓流編輯器邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,可以完成下麵的事情: (1)定義變數來保存數據; (2)使用算數和字元串操作符來處理數據; (3)使用結構化編程概念(比如if then語句和 ...


gawk程式是Unix中原始awk程式的GNU版本。gawk程式讓流編輯器邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,可以完成下麵的事情:
(1)定義變數來保存數據;
(2)使用算數和字元串操作符來處理數據;
(3)使用結構化編程概念(比如if-then語句和迴圈)來為數據處理增加處理邏輯;
(4)通過提取數據文件中的數據元素,將其重新排列或格式化,生成格式化報表;
gawk程式的報告生成能力通常用來從大文本文件中提取數據元素,並將它們格式化成可讀的報告。其中完美的例子是格式化日誌文件。在日誌文件中找出錯誤行會很難,gawk程式可以讓你從日誌文件中過濾出需要的數據元素,然後你可以將其格式化,使得重要的數據易於閱讀。

1 gawk命令格式

gawk option program file
    選項:     描述
    -F fs           指定行中劃分數據欄位的欄位分隔符
    -f file         從指定的文件中讀取程式
    -v var=value        定義gawk程式中的一個變數及其預設值
    -mf N           指定要處理的數據文件中的最大欄位數
    -mr N           指定數據文件中的最大數據行數
    -W  keyword     指定gawk的相容模式或警告等級

命令行選項提供了一個簡單的途徑來定製gawk程式中的功能。
gawk的強大之處在於程式腳本,可以寫腳本來讀取文本行的數據,然後處理並顯示數據,創建任何類型的輸出報告。

2 從命令行讀取程式腳本

(1)gawk程式及腳本用一對花括弧來定義。你必須將命令放到兩個花括弧“{}”中。如果你錯誤的使用了圓括弧來包含gawk腳本,就會出錯。
(2)由於gawk命令行假定腳本是單個文本字元串,你還必須將腳本放到單引號中。
例如:

        [root@centos7 ~]# gawk '{print "Hello World!"}'

運行這個命令,你可能會有些失望,因為什麼都不會發生。原因在於沒有在命令行上指定文件名,所有gawk程式會從STDIN接受數據。在運行這個程式時,它會一直等待從STDIN輸入的文本。
如果你輸入一行文本並按下回車鍵,gawk會對這行文本運行一遍程式腳本。跟sed編輯器一樣,gawk程式會針對數據流中的每一行文本執行程式。由於程式腳本被設為顯示一行固定的文本字元串,因此不管你在數據流中輸入什麼文本,都會得到同樣的文本輸出。

[root@centos7 ~]# gawk '{print "Hello World!"}'
Thie is a error test
Hello World!
Hello World!
Hello World!

要終止這個程式,你必須標明數據流已經結束了。bash shell提供了一個組合鍵倆生成EOF(End –of-File)字元。Ctrl + D 組合鍵會字bash中產生一個EOF字元。這個組合鍵能夠終止該gawk程式並返回到命令行界面提示符下。

3 使用數據欄位變數

gawk的主要特征之一是其處理文本文件中數據的能力。它會自動給一行的每個數據元素分配一個變數。預設情況下,gawk會將如下變數分配給它在文本中發現的數據欄位:

$0  代表整個文本行
$1  代表文本行的第一個數據段
$n  代表文本行的第n個數據段

在文本行中,每個數據段都是通過欄位分隔符劃分的。gawk在讀取一行文本時,會用預定義的欄位分隔符劃分每個欄位。gawk中預設的欄位分隔符是任意的空白字元(例如空格或者製表符)。
例如,用-F指定欄位分隔符。顯示系統密碼文件的第一個數據欄位。由於/etc/passwd用冒號來分隔數據欄位,因而可以將冒號指定為欄位分隔符。

[root@centos7 ~]# gawk -F : '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[……]

4 在程式腳本中使用多個命令

gawk編程語言允許將多條命令組合成一個正常程式。要在命令行上的程式腳本中使用多條命令,只要在命令之間放個分號即可。
例如

[root@centos7 ~]# echo "My name is centos"|gawk '{$4="hahaha";print $0}'
My name is hahaha

第一條命令會給$4賦值。第二條命令會列印整個數據欄位。註意,gawk程式在輸出中已經將原文本中的第四個數據欄位替換了新值。

5 從文本中讀取程式

跟sed編輯器一樣,gawk編輯器允許將程式存儲到文件中,然後再在命令行中引用。

[root@centos7 ~]# cat script2.gawk 
{print $1 "'s' home directory is " $6}
[root@centos7 ~]# gawk -F: -f script2.gawk  /etc/passwd
root's' home directory is /root
bin's' home directory is /bin
daemon's' home directory is /sbin
adm's' home directory is /var/adm
lp's' home directory is /var/spool/lpd
sync's' home directory is /sbin
shutdown's' home directory is /sbin
halt's' home directory is /sbin
mail's' home directory is /var/spool/mail
[……]

script2.gawk程式腳本會再次使用print命令列印/etc/passwd文件中的主目錄數據欄位(欄位變數$6),以及userID數據欄位(欄位變數$1)。
可以在程式文件中指定多條命令。要這麼做的話,只有一天命令放一行即可,不需要使用分號。

[root@centos7 ~]# cat script3.gawk 
{
text = "'s home directory is "
print $1 text $6
}
[root@centos7 ~]# gawk -F: -f script3.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
sync's home directory is /sbin
shutdown's home directory is /sbin
[……]

script3.gawk程式腳本定義了一個變數來保存print命令中用到的文本字元串。
註意:gawk程式在引用變數值時並未像shell腳本一樣使用美元符。

6 在處理數據前運行腳本

gawk還允許指定程式腳本何時運行。預設情況下,gawk會從輸入中讀取一行文本,然後針對該行的數據執行程式腳本。有時可能會需要在處理數據前運行腳本,比如報告創建標題。BEGIN關鍵字就是用來做這個的。它會強制gawk在讀取數據前執行BEGIN關鍵字後指定的程式腳本。

[root@centos7 ~]# cat data3.txt 
Line 1
Line 2
Line 3
[root@centos7 ~]# gawk 'BEGIN{print "The data3 File contents:"}{print $0}' data3.txt The data3 File contents:
Line 1
Line 2
Line 3

在gawk執行了BEGIN腳本後,它會用第二段腳本來處理文件數據。這麼做是要小心,兩段腳本仍然被認為是gawk命令行中的一個文本字元串。你需要相應的加上單引號。

7 在處理數據後運行腳本

與BEGIN關鍵字類似,END關鍵字允許你指定一個程式腳本,gawk會在讀完數據後執行它。

[root@centos7 ~]# gawk '{print $0} END{print "End of file"}' data3.txt 
Line 1
Line 2
Line 3
End of file

當gawk程式列印完文件內容後,會執行END腳本中的命令。這是在處理完所有正常數據後給報告添加頁腳的最佳方法。


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

-Advertisement-
Play Games
更多相關文章
  • timestamp有兩個屬性,分別是CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP兩種,使用情況分別如下: 1. CURRENT_TIMESTAMP 當要向資料庫執行insert操作時,如果有個timestamp欄位屬性設為 CURRENT_TIMES ...
  • Hadoop之HDFS 版權聲明:本文為yunshuxueyuan原創文章。如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/QQ技術交流群:299142667 HDFS介紹 HDFS(Hadoop Distributed File System )Hadoop分 ...
  • 搭建2個節點的hdfs,yarn集群。 namenode和secondarynamenode是分開的,其次rm和namenode位於不同節點。 ...
  • 以管理員的啟動cmd 進入安裝目錄下 輸入: mongod --auth --port 3406 --dbpath=庫地址 --logpath= 全地址 --install --serviceName "自定義名稱" 註:庫地址可只指定到文件夾,LOG地址需指定到具體文件 --auth 啟用權根控制 ...
  • 很多時候,大家都知道,浮點型這個東西,本身存儲就是一個不確定的數值,你永遠無法知道,它是 0 = 0.00000000000000123 還是 0 = 0.00000000000999這樣的東西。也許一開始使用的時候沒有問題,但是有時候做統計的時候,就會看出端倪 簡單的舉個例子,就知道統計的時候,有 ...
  • 一、MySQL數據類型 1.數值型 SMALLINT: 2個位元組 INT: 4個位元組 // age int(10) INTEGER:INT的同義詞 BIGINT : 8個位元組 FLOAT : 4個位元組 DOUBLE : 8個位元組 //score float(10,2) 2.字元串(字元)類型 CHA ...
  • 一、資料庫的基本概念 資料庫: 以一定方式儲存在一起、能為多個用戶共用、具有儘可能小的冗餘度的特點、是與應用程式彼此獨立的數據集合。 DBMS(DataBase Management System,資料庫管理系統)和資料庫。平時談到“資料庫”可能有兩種含義:MSSQLServer、Oracle等某種 ...
  • Jexus 即 Jexus Web Server,簡稱JWS,是Linux平臺上的一款ASP.NET WEB伺服器,是 Linux、Unix、FreeBSD 等非Windows系統架設 ASP.NET WEB 伺服器的核心程式,是企業級ASP.NET跨平臺部署的一種可選方案。與其它WEB伺服器相比, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...