如何在linux上使用awk命令

在Linux上,awk是一種命令列文字操作生成器,也是一種功能強大的指令碼語言。下面介紹一些最酷的功能。...

在Linux上,awk是一種命令列文字操作生成器,也是一種功能強大的指令碼語言。下面介紹一些最酷的功能。

awk是怎麼得名的

awk命令的名字是使用1977年編寫原始版本的三個人的縮寫:阿爾弗雷德·阿霍、彼得·溫伯格和布萊恩·克尼漢。這三個人來自傳說中的AT&T貝爾實驗室Unix pantheon。在許多其他國家的貢獻下,特設工作組繼續發展。

它是一種完整的指令碼語言,也是命令列的完整文字操作工具包。如果本文激發了您的胃口,您可以檢視有關awk及其功能的所有細節。

規則、模式和操作

awk在包含由模式和動作組成的規則的程式上工作。對與模式匹配的文字執行操作。圖案用大括號({})括起來。一個模式和一個動作共同構成一個規則。整個awk程式用單引號(')括起來。

讓我們看看最簡單的awk程式型別。它沒有模式,所以它匹配輸入的每一行文字。這意味著操作在每一行上執行。我們將在who命令的輸出中使用它。

世衛組織的標準產出如下:

who

如何在linux上使用awk命令

也許我們不需要所有這些資訊,但是,更確切地說,我們只想看到賬戶上的名字。我們可以將who的輸出匯入awk,然後告訴awk只打印第一個欄位。

預設情況下,awk認為欄位是由空格、行首或行尾包圍的字串。欄位由美元符號($)和數字標識。所以,$1代表第一個欄位,我們將用它和print操作一起列印第一個欄位。

我們鍵入以下內容:

who | awk '{print $1}'

如何在linux上使用awk命令

awk列印第一個欄位並丟棄行的其餘部分。

我們可以列印任意多的欄位。如果我們新增逗號作為分隔符,awk會在每個欄位之間列印一個空格。

我們鍵入以下內容還可以列印人員登入的時間(欄位4):

who | awk '{print $1,$4}'

如何在linux上使用awk命令

有幾個特殊的欄位識別符號。它們表示整行文字和文字行中的最後一個欄位:

  • $0:表示整行文字。
  • $1:表示第一個欄位。
  • $2:表示第二個欄位。
  • $7:表示第七個欄位。
  • $45:表示第45個欄位。
  • $NF:表示“欄位數”,表示最後一個欄位。

我們將鍵入以下內容,以顯示一個小文字檔案,其中包含DennisRitchie的簡短報價:

cat dennis_ritchie.txt

如何在linux上使用awk命令

我們希望awk列印報價的第一個、第二個和最後一個欄位。請注意,儘管它在終端視窗中環繞,但它只是一行文字。

我們鍵入以下命令:

awk '{print $1,$2,$NF}' dennis_ritchie.txt

如何在linux上使用awk命令

我們不知道“簡單性”是文字行中的第18個欄位,我們不在乎。我們只知道它是最後一個欄位,我們可以使用$NF來獲取它的值。週期只是場主體中的另一個字元。

新增輸出欄位分隔符

您還可以告訴awk在欄位之間列印特定字元,而不是預設的空格字元。date命令的預設輸出有點奇怪,因為時間就在它的中間。但是,我們可以鍵入以下內容並使用awk提取所需欄位:

date date | awk '{print $2,$3,$6}'

如何在linux上使用awk命令

我們將使用OFS(output field separator)變數在月、日和年之間放置一個分隔符。請注意,下面我們將命令括在單引號(')中,而不是大括號({}):

date | awk 'OFS="/" {print$2,$3,$6}' date | awk 'OFS="-" {print$2,$3,$6}'

如何在linux上使用awk命令

開始和結束規則

在任何文字處理開始之前,一個開始規則將執行一次。事實上,它是在awk讀取任何文字之前執行的。在所有處理完成後執行結束規則。您可以有多個開始和結束規則,它們將按順序執行。

對於BEGIN規則的示例,我們將列印來自dennis的整個引用_裡奇.txt我們以前使用的檔案,上面有一個標題。

為此,我們鍵入以下命令:

awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt

如何在linux上使用awk命令

注意,BEGIN規則有自己的一組操作,它們包含在自己的一組大括號({})。

我們可以將這個相同的技術與之前用於將who的輸出匯入awk的命令一起使用。為此,我們鍵入以下內容:

who | awk 'BEGIN {print "Active Sessi***"} {print $1,$4}'

如何在linux上使用awk命令

輸入欄位分隔符

如果希望awk處理不使用空格分隔欄位的文字,則必須告訴它文字使用哪個字元作為欄位分隔符。例如,/etc/passwd檔案使用冒號(:)分隔欄位。

我們將使用該檔案和-F(分隔符字串)選項來告訴awk使用冒號(:)作為分隔符。我們鍵入以下命令來告訴awk列印使用者帳戶和主資料夾的名稱:

awk -F: '{print $1,$6}' /etc/passwd

如何在linux上使用awk命令

輸出包含使用者帳戶的名稱(或應用程式或守護程式名稱)和主資料夾(或應用程式的位置)。

如何在linux上使用awk命令

新增圖案

如果我們只對普通使用者帳戶感興趣,我們可以在列印操作中包含一個模式,以過濾掉所有其他條目。因為使用者標識號等於或大於1000,所以我們可以根據這些資訊篩選。

僅當第三個欄位($3)包含1000或更大的值時,我們鍵入以下內容以執行列印操作:

awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd

如何在linux上使用awk命令

模式應該緊跟在與其關聯的操作之前。

我們可以使用BEGIN規則為我們的小報告提供標題。鍵入以下內容,使用(\n)表示法將換行符**標題字串:

awk -F: 'BEGIN {print "User Accounts\n-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd

如何在linux上使用awk命令

模式是成熟的正則表示式,它們是awk的榮耀之一。

假設我們希望看到裝載的檔案系統的通用唯一識別符號(uuid)。如果我們在/etc/fstab檔案中搜索字串“UUID”的出現,它應該會為我們返回該資訊。

我們在命令中使用搜索模式“/UUID/”:

awk '/UUID/ {print $0}' /etc/fstab

如何在linux上使用awk命令

它會找到所有出現的“UUID”,並列印這些行。實際上,如果沒有列印操作,我們會得到相同的結果,因為預設操作會列印整個文字行。但是,為了清晰起見,明確的表達通常是有用的。當你瀏覽一個指令碼或歷史檔案時,你會很高興你為自己留下線索。

找到的第一行是一條註釋行,雖然“UUID”字串位於註釋行的中間,但awk仍然找到了它。我們可以調整正則表示式,並告訴awk只處理以“UUID”開頭的行。為此,我們鍵入以下內容,其中包括行標記的開始(^):

awk '/^UUID/ {print $0}' /etc/fstab

如何在linux上使用awk命令

這樣更好!現在,我們只看到真正的安裝說明。為了進一步細化輸出,我們鍵入以下內容並將顯示限制為第一個欄位:

awk '/^UUID/ {print $1}' /etc/fstab

如何在linux上使用awk命令

如果我們在這臺機器上安裝了多個檔案系統,我們會得到一個整潔的uuid表。

內建函式

awk有許多函式,您可以在自己的程式中呼叫和使用,無論是從命令列還是在指令碼中。如果你做一些挖掘,你會發現它很有成效。

為了演示呼叫函式的一般技術,我們將看一些數字方法。例如,下面列印625的平方根:

awk 'BEGIN { print sqrt(625)}'

此命令列印0(零)和-1(正好是數學常數pi)的反正切:

awk 'BEGIN {print atan2(0, -1)}'

在以下命令中,我們在列印atan2()函式之前修改其結果:

awk 'BEGIN {print atan2(0, -1)*100}'

函式可以接受表示式作為引數。例如,這裡有一個複雜的方法來求25的平方根:

awk 'BEGIN { print sqrt((2+3)*5)}'

如何在linux上使用awk命令

awk指令碼

如果您的命令列變得複雜,或者您開發了一個您知道要再次使用的例程,您可以將awk命令轉換為指令碼。

在我們的示例指令碼中,我們將執行以下所有操作:

  • 告訴shell要使用哪個可執行檔案來執行指令碼。
  • 準備awk以使用FS field separator變數讀取輸入文字,其中欄位由冒號(:)分隔。
  • 使用OFS輸出欄位分隔符告訴awk使用冒號(:)分隔輸出中的欄位。
  • 將計數器設定為0(零)。
  • 將每行文字的第二個欄位設定為空值(它總是一個“x”,所以我們不需要看到它)。
  • 列印具有修改的第二個欄位的行。
  • 增加計數器。
  • 列印計數器的值。

我們的指令碼如下所示。

如何在linux上使用awk命令

BEGIN規則執行準備步驟,END規則顯示計數器值。中間規則(沒有名稱,也沒有模式,所以它匹配每一行)修改第二個欄位,列印行,並增加計數器。

指令碼的第一行告訴shell要使用哪個可執行檔案(在我們的示例中是awk)來執行指令碼。它還將-f(filename)選項傳遞給awk,awk通知它要處理的文字將來自一個檔案。我們將在執行指令碼時將檔名傳遞給指令碼。

我們已將以下指令碼作為文字包含在內,以便您可以剪下和貼上:

#!/usr/bin/awk -f BEGIN { # set the input and output field separators FS=":" OFS=":" # zero the accounts counter accounts=0 } { # set field 2 to nothing $2="" # print the entire line print $0 # count another account accounts++ } END { # print the results print accounts " accounts.\n" }

將其儲存到名為省略.awk. 要使指令碼可執行,請使用chmod鍵入以下內容:

chmod +x omit.awk

如何在linux上使用awk命令

現在,我們將執行它並將/etc/passwd檔案傳遞給指令碼。這是awk將使用指令碼中的規則為我們處理的檔案:

./omit.awk /etc/passwd

如何在linux上使用awk命令

將處理檔案並顯示每一行,如下所示。

如何在linux上使用awk命令

第二個欄位中的“x”項已被刪除,但請注意,欄位分隔符仍然存在。對行進行計數,並在輸出的底部給出總數。

awk不代表笨拙

awk不代表笨拙,它代表優雅。它被描述為一個處理過濾器和一個報告編寫器。更準確地說,它是這兩個,或者,更確切地說,一個工具,你可以使用這兩個任務。只需幾行程式碼,awk就可以用傳統語言實現需要大量編碼的功能。

這種能力是由包含模式的規則、選擇要處理的文字的規則和定義處理的操作的簡單概念來利用的。

  • 發表於 2021-04-02 15:02
  • 閱讀 ( 50 )
  • 分類:網際網路

你可能感興趣的文章

40多個最常用的linux終端命令

... 在您真正充分利用終端之前,您需要知道如何導航它。這就是為什麼我們認為這些是最基本的Linux命令:如果你不能更改目錄或者在一個你不記得如何使用的命令上獲得幫助,那麼再多的終端知識也幫不了你。 ...

  • 發佈於 2021-03-15 21:40
  • 閲讀 ( 50 )

如何在linux上安裝和使用powershell

... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...

  • 發佈於 2021-03-16 02:34
  • 閲讀 ( 53 )

如何在android和termux上使用linux命令列

...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...

  • 發佈於 2021-03-18 07:26
  • 閲讀 ( 63 )

如何在windows10上獲得linux bash shell

... 如何在windows10上安裝linux bash shell ...

  • 發佈於 2021-03-21 11:48
  • 閲讀 ( 60 )

linux下如何重新命名檔案

要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...

  • 發佈於 2021-03-22 02:48
  • 閲讀 ( 67 )

如何在linux上使用groupadd管理使用者組

... 相關:如何在Linux中更改密碼 ...

  • 發佈於 2021-03-26 17:15
  • 閲讀 ( 43 )

如何在linux中新增使用者

想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...

  • 發佈於 2021-03-26 23:29
  • 閲讀 ( 69 )

初學者的nmap:獲得埠掃描的實踐經驗

... 如何使用nmap掃描網路 ...

  • 發佈於 2021-03-28 11:48
  • 閲讀 ( 44 )

針對初學者系統管理員的10個linux強化提示

...管理工具。但無論系統設計得多麼好,其安全性都取決於使用者。 ...

  • 發佈於 2021-03-28 14:39
  • 閲讀 ( 51 )

如何在linux上使用whois命令

...第五項,從whois的響應中提取每個域的過期日期。 相關:如何在Linux上使用awk命令 方便和自動化 是的,你也可以在網上進行whois查詢。但是,在終端視窗和指令碼中使用whois命令提供了方便性和靈活性,並使您可以選擇自動化一...

  • 發佈於 2021-04-01 23:54
  • 閲讀 ( 46 )
poolase
poolase

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦