Linux 命令:awk

1. 寫在前面

本文主要介紹 Linux “awk” 命令:“awk” 是另一個強大的文本處理工具,用于處理和操作結構化數據,如日志文件和命令輸出。它可以根據需要為我們打印特定的列值。

公眾號: 滑翔的紙飛機

2. awk 命令

我們能用 awk 做什么?awk 處理文本數據,不管是從文件來的或者數據流中來的。輸入數據被區分為記錄和文本域。 awk 一次處理一條記錄,一直到輸入結束。

  • awk 操作:

(1) 逐行掃描文件;
(2) 將每個輸入行分割成字段;
(3) 將輸入行/字段與匹配規則進行比較;
(4) 對匹配的行執行操作;

  • 適用于:

(1) 轉換數據文件;
(2) 生成格式化報告;

  • 編程結構:

(1) 輸出行格式化;
(2) 算術和字符串運算;
(3) 條件和循環;

awk 命令的基本語法是:

awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

-F fs:指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:;
-f program-file:從腳本文件中讀取awk命令;
-v: 后跟var=value,賦值一個用戶定義變量;

備注: 示例文本文件:text.txt、text2.txt

cat > ./text.txt
---------------------------------------------------
Dwight Frances manager account 45000
Lindsay Max clerk account 25000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000
Gale Evelina peon sales 15000
Baron Eveline clerk sales 23000
Will Pater peon sales 13000
Christopher Noah director purchase 80000
cat > ./text2.txt
---------------------------------------------------
A    B    CTarun    A12    1
Man    B6    2
Praveen    M42    3

2.1 簡單示例

(1)awk 的默認行為

默認情況下,awk 會打印指定文件中的每一行數據。

root@dev:~/linux# awk '{print}' text.txt 
---------------------------------------------------
Dwight Frances manager account 45000
Lindsay Max clerk account 25000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000
Gale Evelina peon sales 15000
Baron Eveline clerk sales 23000
Will Pater peon sales 13000
Christopher Noah director purchase 80000

在上述示例中,沒有給出任何模式。因此操作適用于所有行。不帶任何參數的 print 參數默認打印整行,因此它可以打印文件的所有行,不會出現失敗。

(2)打印與給定模式匹配的行

root@dev:~/linux# awk '/manager/ {print}' text.txt 
---------------------------------------------------
Dwight Frances manager account 45000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000

在上例中,awk 命令會打印所有與 "manager "匹配的行。

**備注:**一個正則表達式匹配一系列字符串。awk 正則表達式樣式使用//來包裹,可以是任何一種其他的正則表達式。這是一個例子,打印任何以兩個或者更多數字開頭的記錄的第一個文本域:

root@dev:~/linux# awk '/^[A-B][a-z]/ { print $1,$2 }' text.txt
---------------------------------------------------------------
Baron Eveline

(3)將一行拆分為多個字段

對于每條記錄(即行),awk 命令默認以空格字符分割記錄,并將其存儲在 $n 變量中。如果一行有 4 個字段,則分別存儲在 $1、$2、$3 和 $4 中。另外,$0 代表整行。

root@dev:~/linux# awk '{print $1,$2,$5}' text.txt 
---------------------------------------------------
Dwight Frances 45000
Lindsay Max 25000
Jo Richardson 50000
Rosalind Watt 47000
Gale Evelina 15000
Baron Eveline 23000
Will Pater 13000
Christopher Noah 80000

在上例中,$1,$2$5 分別代表姓名和薪金字段。

(4)打印文本中每一行的第一個字段以及用"-"分隔的行號

root@dev:~/linux# awk '{print NR " - " $1,$2 }' text.txt 
-------------------------------------------------------------
1 - Dwight Frances
2 - Lindsay Max
3 - Jo Richardson
4 - Rosalind Watt
5 - Gale Evelina
6 - Baron Eveline
7 - Will Pater
8 - Christopher Noah

在上例中,$1,$2 代表姓名輸出行號,“ - ”進行分割;

(5)如果存在,打印任何空行

root@dev:~/linux# awk 'NF == 0 {print NR}' text2.txt 
-------------------------------------------------------------
2

或者

root@dev:~/linux# awk 'NF <= 0 {print NR}' text2.txt 
-------------------------------------------------------------
2

(6) 查找文件中最長一行的長度

root@dev:~/linux# awk '{ if (length($0) > max) max = length($0) } END { print max }'  text.txt 
-------------------------------------------------------------------------------------
40

(7) 計算文件中的行數

root@dev:~/linux# awk 'END { print NR }'  text.txt 
------------------------------------------------------------------
8

(8) 打印超過 35 個字符的行

root@dev:~/linux# awk 'length($0) > 35'  text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000
Christopher Noah director purchase 80000

(9) 查找/檢查任何特定列中的任何字符串

root@dev:~/linux# awk '$1 == "Dwight" { print $0 }' text.txt
------------------------------------------------------------------
Dwight Frances manager account 45000或者:
root@dev:~/linux# awk '{ if($1 == "Dwight") print $0;}' text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000

(10)打印從 1 到 n 的第一個數字的平方,例如 6

root@dev:~/linux# awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }'
--------------------------------------------------------------------------------
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36

(11) 計算文件大小

root@dev:~/linux# ls -l *.txt | awk '{sum+=$5} END {print sum}'
------------------------------------------------------------------
336

(12) 匹配包含 “manager” 直到 “account"記錄

root@dev:~/linux# awk '/manager/,/account/ { print $0 }' text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000

2.2 awk 中的內置變量

awk 的內置變量包括字段變量–$1、$2、$3 等($0 表示整行)–它們將一行文本分割成單個單詞或稱為字段的片段。

變量描述
$n當前記錄的第n個字段,字段間由FS分隔
$0完整的輸入記錄
ARGC命令行參數的數目
ARGIND命令行中當前文件的位置(從0開始算)
ARGV包含命令行參數的數組
CONVFMT數字轉換格式(默認值為%.6g)ENVIRON環境變量關聯數組
ERRNO最后一個系統錯誤的描述
FIELDWIDTHS字段寬度列表(用空格鍵分隔)
FILENAME當前文件名
FNR各文件分別計數的行號
FS字段分隔符(默認是任何空格)
IGNORECASE如果為真,則進行忽略大小寫的匹配
NF一條記錄的字段的數目
NR已經讀出的記錄數,就是行號,從1開始
OFMT數字的輸出格式(默認值是%.6g)
OFS輸出字段分隔符,默認值與輸入字段分隔符一致
ORS輸出記錄分隔符(默認值是一個換行符)
RLENGTH由match函數所匹配的字符串的長度
RS記錄分隔符(默認是一個換行符)
RSTART由match函數所匹配的字符串的第一個位置
SUBSEP數組下標分隔符(默認值是/034)

2.2.1 示例

(1)使用 NR 內置變量(顯示行號)

root@dev:~/linux# awk '{print NR,$0}' text.txt 
---------------------------------------------------
1 Dwight Frances manager account 45000
2 Lindsay Max clerk account 25000
3 Jo Richardson manager sales 50000
4 Rosalind Watt manager account 47000
5 Gale Evelina peon sales 15000
6 Baron Eveline clerk sales 23000
7 Will Pater peon sales 13000
8 Christopher Noah director purchase 80000

在上例中,帶有 NR 的 awk 命令會打印所有行以及行號。

(2)使用 NF 內置變量(顯示最后字段)

root@dev:~/linux# awk '{print $1,$2,$NF}' text.txt 
Dwight Frances 45000
Lindsay Max 25000
Jo Richardson 50000
Rosalind Watt 47000
Gale Evelina 15000
Baron Eveline 23000
Will Pater 13000
Christopher Noah 80000

在上例中,$1,$2 代表姓名,$NF 代表薪金。我們可以使用 $NF 獲取薪金,其中 $NF 代表最后一個字段。

(3) NR 內置變量的另一種用法(顯示行從 3 到 6行)

root@dev:~/linux# awk 'NR==3, NR==6 {print NR,$0}' text.txt 
3 Jo Richardson manager sales 50000
4 Rosalind Watt manager account 47000
5 Gale Evelina peon sales 15000
6 Baron Eveline clerk sales 23000

在上例中,顯示3 ~ 6行記錄,顯示行號;

(4) 忽略大小寫

root@dev:~/linux# awk 'BEGIN{IGNORECASE=1} /evelina/' text.txt 
-----------------------------------------------------------------------
Gale Evelina peon sales 15000root@dev:~/linux# awk 'BEGIN{IGNORECASE=1} /Evelina/' text.txt 
-----------------------------------------------------------------------
Gale Evelina peon sales 15000

(5) 打印文件名及行數

root@dev:~/linux# awk 'END { print "File", FILENAME, "contains", NR, "lines." }' text.txt 
-----------------------------------------------------------------------------------
File text.txt contains 8 lines.

更多示例后續不斷補充。

感謝您花時間閱讀文章!
關注公眾號不迷路!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20455.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 控件保持寬高比得幾種方式

文章目錄 Android 控件保持寬高比得幾種方式adjustViewBounds百分比布局ConstraintLayout自定義View Android 控件保持寬高比得幾種方式 adjustViewBounds 僅適用于 ImageView&#xff0c;保持橫豎比。 <ImageViewandroid:layout_width"match_parent"android:l…

動態規劃(Dynamic-Programming)問題講解

動態規劃類問題 從已知子問題的解&#xff0c;推導出當前問題的解 推導過程可以表達為一個數學公式用一維或二維數組來保存之前的計算結果&#xff08;可以進一步降維優化&#xff09; 將當前問題 分解成子問題 &#xff0c;找出遞歸公式&#xff0c;分階段進行求解 求解過程中…

vue3+ts封裝一個button組件

創建一個新的Button組件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 創建生成器的方式 生成器推導式yield關鍵字 生成器相關方法 for&#xff1a;循環遍歷生成器中的每一個值next&#xff1a;獲取生成器中的下一個值 生成器注意點 代碼執行到yield會暫停&#xff0c;然后把結果返回出去&#xff0c;下次啟動生成器會在暫停的位置繼續執行…

進程間通信(27000字超詳解)

&#x1f30e;進程間通信 文章目錄&#xff1a; 進程間通信 進程間通信簡介 ??????進程間通信目的 ??????初識進程間通信 ??????進程間通信的分類 匿名管道通信 ??????認識管道 ??????匿名管道 ??????匿名管道測試 ??????管道的四種…

第十五課,海龜畫圖:抬筆與落筆函數、畫曲線函數

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起與落下畫筆函數 當使用上節課學習的這個turtle.forward()&#xff1a;畫筆前進函數時&#xff0c;畫筆會朝著當前方向在畫布上留下一條指定&#xff08;像素&#xff09;長度的直線&#xff0c;但你可能發現&a…

Map Python用法:深度解析與應用探索

Map Python用法&#xff1a;深度解析與應用探索 在Python編程中&#xff0c;map() 函數是一種強大的內置高階函數&#xff0c;用于對可迭代對象中的每個元素應用指定的函數&#xff0c;并返回一個新的迭代器&#xff0c;其中包含函數應用后的結果。本文將從四個方面、五個方面…

Bean的生命周期中有哪些對外開放的接口,及各種作用

Bean的生命周期中有哪些對外開放的接口&#xff0c;及各種作用 在 Spring 框架中&#xff0c;Bean 的生命周期可以通過一系列的回調接口來管理和控制。以下是 Spring 中對外開放的主要 Bean 生命周期接口以及它們的作用&#xff1a; InitializingBean 和 DisposableBean 接口&…

C++|set、map模擬實現<——紅黑樹

目錄 一、紅黑樹的迭代器 1.1紅黑樹迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用紅黑樹搭配map和set(仿函數) 三、紅黑樹封裝map和set(簡易版…

springboot + Vue前后端項目(第十三記)

項目實戰第十三記 寫在前面1.建立角色表2. 后端代碼生成2.1 RoleController 3. 前端頁面的搭建3.1 Role.vue3.2 路由3.3 Aside.vue3.4 頁面效果 4.建立菜單表5.后端代碼編寫5.1 Menu5.2 MenuController 6.前端頁面的搭建6.1 Menu.vue6.2 路由6.3 Aside.vue6.4 頁面效果 總結寫在…

keepalived安裝文檔

目錄 1、安裝環境 2、安裝keepalived 2.1 上傳keepalived安裝文件 2.2 解壓 2.3 安裝keepalived 2.4 加入開機啟動&#xff1a; 2.5 配置日志文件 2.6 打開防火墻的通訊地址 1、安裝環境 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y …

vx小程序初學

小程序初學 在我還沒接觸到微信小程序之前&#xff0c;通常使用輪播要么手寫或使用swiper插件去實現&#xff0c;當我接觸到微信小程序之后&#xff0c;我看到了微信小程序的強大之處&#xff0c;讓我為大家介紹一下吧&#xff01; swiper與swiper-item一起使用可以做輪播圖 …

把自己的服務器添加到presearch節點

Presearch is a scam. Before, judging by the price of the token you should have been able to get between $150-$200 after 12-13 months of regular searches. "If you use this service for the next 11 years you will have earned $30!" Presearch大約需要…

Easy RoCE:在SONiC交換機上一鍵啟用無損以太網

RDMA&#xff08;遠程直接內存訪問&#xff09;技術是一種繞過 CPU 或操作系統&#xff0c;在計算機之間直接傳輸內存數據的技術。它釋放了內存帶寬和 CPU&#xff0c;使節點之間的通信具有更低的延遲和更高的吞吐量。目前&#xff0c;RDMA 技術已廣泛應用于高性能計算、人工智…

車流量監控系統

1.項目介紹 本文檔是對于“車流量檢測平臺”的應用技術進行匯總&#xff0c;適用于此系統所有開發&#xff0c;測試以及使用人員&#xff0c;其中包括設計背景&#xff0c;應用場景&#xff0c;系統架構&#xff0c;技術分析&#xff0c;系統調度&#xff0c;環境依賴&#xf…

MongoDB~存儲引擎了解

存儲引擎 存儲引擎是一個數據庫的核心&#xff0c;主要負責內存、磁盤里數據的管理和維護。 MongoBD的優勢&#xff0c;在于其數據模型定義的靈活性、以及可拓展性。但不要忽略&#xff0c;其存儲引擎也是插件式的存在&#xff0c;支持不同類型的存儲引擎&#xff0c;使用不同…

導線防碰撞警示燈:高壓線路安全保障

導線防碰撞警示燈&#xff1a;高壓線路安全保障 在廣袤的大地上&#xff0c;高壓線路如同血脈般縱橫交錯&#xff0c;然而&#xff0c;在這看似平靜的電力輸送背后&#xff0c;卻隱藏著不容忽視的安全隱患。特別是在那些輸電線路跨越道路、施工等區域的路段&#xff0c;線下超…

頂點著色技術在AI去衣中的作用

在當今的數字時代&#xff0c;人工智能&#xff08;AI&#xff09;已經滲透到我們生活的方方面面&#xff0c;從智能家居到自動駕駛汽車&#xff0c;再到在線購物推薦。然而&#xff0c;AI的影響遠不止于此。近年來&#xff0c;AI在圖像處理和計算機視覺領域的應用取得了顯著進…

c++字符串相關接口

c字符串相關接口 1.str2wstr(str轉換wstr)2.wstr2str(str轉換wstr)3.Utf8ToAsi(Utf8轉換ANSI)4.AsiToUtf8(ANSI轉換Utf8)5.stringformatA/stringformatW(按照指定的格式格式化字符串)6.GetStringBetween(獲取cStart cEnd之間的字符串)7.Char2Int(char轉int)8.Str2Bin(字符串轉換…

視覺語言大模型llava學習

1. 拉取 https://github.com/haotian-liu/LLaVA 視覺語言大模型是人工智能領域一種重要的多模態模型&#xff0c;它結合了計算機視覺&#xff08;CV&#xff09;和自然語言處理&#xff08;NLP&#xff09;的技術&#xff0c;使得模型能夠同時理解圖像和文本信息。這類模型在多…