在Linux上,awk是一種命令列文字操作生成器,也是一種功能強大的指令碼語言。下面介紹一些最酷的功能。
awk命令的名字是使用1977年編寫原始版本的三個人的縮寫:阿爾弗雷德·阿霍、彼得·溫伯格和布萊恩·克尼漢。這三個人來自傳說中的AT&T貝爾實驗室Unix pantheon。在許多其他國家的貢獻下,特設工作組繼續發展。
它是一種完整的指令碼語言,也是命令列的完整文字操作工具包。如果本文激發了您的胃口,您可以檢視有關awk及其功能的所有細節。
awk在包含由模式和動作組成的規則的程式上工作。對與模式匹配的文字執行操作。圖案用大括號({})括起來。一個模式和一個動作共同構成一個規則。整個awk程式用單引號(')括起來。
讓我們看看最簡單的awk程式型別。它沒有模式,所以它匹配輸入的每一行文字。這意味著操作在每一行上執行。我們將在who命令的輸出中使用它。
世衛組織的標準產出如下:
who也許我們不需要所有這些資訊,但是,更確切地說,我們只想看到賬戶上的名字。我們可以將who的輸出匯入awk,然後告訴awk只打印第一個欄位。
預設情況下,awk認為欄位是由空格、行首或行尾包圍的字串。欄位由美元符號($)和數字標識。所以,$1代表第一個欄位,我們將用它和print操作一起列印第一個欄位。
我們鍵入以下內容:
who | awk '{print $1}'awk列印第一個欄位並丟棄行的其餘部分。
我們可以列印任意多的欄位。如果我們新增逗號作為分隔符,awk會在每個欄位之間列印一個空格。
我們鍵入以下內容還可以列印人員登入的時間(欄位4):
who | awk '{print $1,$4}'有幾個特殊的欄位識別符號。它們表示整行文字和文字行中的最後一個欄位:
我們將鍵入以下內容,以顯示一個小文字檔案,其中包含DennisRitchie的簡短報價:
cat dennis_ritchie.txt我們希望awk列印報價的第一個、第二個和最後一個欄位。請注意,儘管它在終端視窗中環繞,但它只是一行文字。
我們鍵入以下命令:
awk '{print $1,$2,$NF}' dennis_ritchie.txt我們不知道“簡單性”是文字行中的第18個欄位,我們不在乎。我們只知道它是最後一個欄位,我們可以使用$NF來獲取它的值。週期只是場主體中的另一個字元。
您還可以告訴awk在欄位之間列印特定字元,而不是預設的空格字元。date命令的預設輸出有點奇怪,因為時間就在它的中間。但是,我們可以鍵入以下內容並使用awk提取所需欄位:
date date | awk '{print $2,$3,$6}'我們將使用OFS(output field separator)變數在月、日和年之間放置一個分隔符。請注意,下面我們將命令括在單引號(')中,而不是大括號({}):
date | awk 'OFS="/" {print$2,$3,$6}' date | awk 'OFS="-" {print$2,$3,$6}'在任何文字處理開始之前,一個開始規則將執行一次。事實上,它是在awk讀取任何文字之前執行的。在所有處理完成後執行結束規則。您可以有多個開始和結束規則,它們將按順序執行。
對於BEGIN規則的示例,我們將列印來自dennis的整個引用_裡奇.txt我們以前使用的檔案,上面有一個標題。
為此,我們鍵入以下命令:
awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt注意,BEGIN規則有自己的一組操作,它們包含在自己的一組大括號({})。
我們可以將這個相同的技術與之前用於將who的輸出匯入awk的命令一起使用。為此,我們鍵入以下內容:
who | awk 'BEGIN {print "Active Sessi***"} {print $1,$4}'如果希望awk處理不使用空格分隔欄位的文字,則必須告訴它文字使用哪個字元作為欄位分隔符。例如,/etc/passwd檔案使用冒號(:)分隔欄位。
我們將使用該檔案和-F(分隔符字串)選項來告訴awk使用冒號(:)作為分隔符。我們鍵入以下命令來告訴awk列印使用者帳戶和主資料夾的名稱:
awk -F: '{print $1,$6}' /etc/passwd輸出包含使用者帳戶的名稱(或應用程式或守護程式名稱)和主資料夾(或應用程式的位置)。
如果我們只對普通使用者帳戶感興趣,我們可以在列印操作中包含一個模式,以過濾掉所有其他條目。因為使用者標識號等於或大於1000,所以我們可以根據這些資訊篩選。
僅當第三個欄位($3)包含1000或更大的值時,我們鍵入以下內容以執行列印操作:
awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd模式應該緊跟在與其關聯的操作之前。
我們可以使用BEGIN規則為我們的小報告提供標題。鍵入以下內容,使用(\n)表示法將換行符**標題字串:
awk -F: 'BEGIN {print "User Accounts\n-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd模式是成熟的正則表示式,它們是awk的榮耀之一。
假設我們希望看到裝載的檔案系統的通用唯一識別符號(uuid)。如果我們在/etc/fstab檔案中搜索字串“UUID”的出現,它應該會為我們返回該資訊。
我們在命令中使用搜索模式“/UUID/”:
awk '/UUID/ {print $0}' /etc/fstab它會找到所有出現的“UUID”,並列印這些行。實際上,如果沒有列印操作,我們會得到相同的結果,因為預設操作會列印整個文字行。但是,為了清晰起見,明確的表達通常是有用的。當你瀏覽一個指令碼或歷史檔案時,你會很高興你為自己留下線索。
找到的第一行是一條註釋行,雖然“UUID”字串位於註釋行的中間,但awk仍然找到了它。我們可以調整正則表示式,並告訴awk只處理以“UUID”開頭的行。為此,我們鍵入以下內容,其中包括行標記的開始(^):
awk '/^UUID/ {print $0}' /etc/fstab這樣更好!現在,我們只看到真正的安裝說明。為了進一步細化輸出,我們鍵入以下內容並將顯示限制為第一個欄位:
awk '/^UUID/ {print $1}' /etc/fstab如果我們在這臺機器上安裝了多個檔案系統,我們會得到一個整潔的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)}'如果您的命令列變得複雜,或者您開發了一個您知道要再次使用的例程,您可以將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現在,我們將執行它並將/etc/passwd檔案傳遞給指令碼。這是awk將使用指令碼中的規則為我們處理的檔案:
./omit.awk /etc/passwd將處理檔案並顯示每一行,如下所示。
第二個欄位中的“x”項已被刪除,但請注意,欄位分隔符仍然存在。對行進行計數,並在輸出的底部給出總數。
awk不代表笨拙,它代表優雅。它被描述為一個處理過濾器和一個報告編寫器。更準確地說,它是這兩個,或者,更確切地說,一個工具,你可以使用這兩個任務。只需幾行程式碼,awk就可以用傳統語言實現需要大量編碼的功能。
這種能力是由包含模式的規則、選擇要處理的文字的規則和定義處理的操作的簡單概念來利用的。
... 在您真正充分利用終端之前,您需要知道如何導航它。這就是為什麼我們認為這些是最基本的Linux命令:如果你不能更改目錄或者在一個你不記得如何使用的命令上獲得幫助,那麼再多的終端知識也幫不了你。 ...
... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...
...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...
... 如何在windows10上安裝linux bash shell ...
要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...
想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...
...第五項,從whois的響應中提取每個域的過期日期。 相關:如何在Linux上使用awk命令 方便和自動化 是的,你也可以在網上進行whois查詢。但是,在終端視窗和指令碼中使用whois命令提供了方便性和靈活性,並使您可以選擇自動化一...