Home >> Blog >> Unix/Linux 中的 AWK 命令及範例

Unix/Linux 中的 AWK 命令及範例

awk 是一種用於處理數據和生成報告的腳本語言。awk 命令編程語言不需要編譯,並允許用戶使用變量、數字函數、字符串函數和邏輯運算符。

awk 是一個實用程序,它使程序員能夠以語句的形式編寫微小但有效的程序,這些語句定義要在文檔的每一行中搜索的文本模式以及在找到匹配項時要執行的操作線。awk 主要用於模式掃描和處理。它搜索一個或多個文件以查看它們是否包含與指定模式匹配的行,然後執行相關操作。

Awk 是開發人員名稱的縮寫——Aho、Weinberger 和 Kernighan。

Awk 是開發人員名稱的縮寫——Aho、Weinberger 和 Kernighan。

1. AWK 操作:

(a) 逐行掃描文件

(b) 將每個輸入行拆分為字段

(c) 將輸入行/字段與模式進行比較

(d) 對匹配的行執行操作

2. 適用於:

(a) 轉換數據文件

(b) 生成格式化報告

3. 編程結構:

(a) 格式化輸出行

(b) 算術和字符串運算

(c) 條件和循環

句法:

awk options 'selection _criteria {action }' input-file > output-file

選項:

-f program-file : Reads the AWK program source from the file
program-file, instead of from the
first command line argument.
-F fs : Use fs for the input field separator

示例命令

例子:

考慮以下文本文件作為以下所有情況的輸入文件:

$cat > employee.txt

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000

在上面的例子中,沒有給出任何模式。因此,這些操作適用於所有行。默認情況下,不帶任何參數的操作打印會打印整行,因此它會打印文件的所有行而不會失敗。

2. 打印與給定模式匹配的行。

$ awk '/manager/ {print}' employee.txt

輸出:

ajay manager account 45000
varun manager sales 50000
amit manager account 47000

在上面的例子中,awk 命令打印所有與“manager”匹配的行。

3. 將行拆分為字段:對於每條記錄,即行,awk 命令默認拆分由空白字符分隔的記錄,並將其存儲在 $n 變量中。如果該行有 4 個單詞,它將分別存儲在 $1、$2、$3 和 $4 中。此外,$0 代表整行。

$ awk '{print $1,$4}' employee.txt

輸出:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000 deepak 23000
sunil 13000
satvik 80000

在上面的示例中,$1 和 $4 分別代表 Name 和 Salary 字段。

awk 中的內置變量

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

  • NR: NR 命令保留當前輸入記錄數的計數。請記住,記錄通常是行。awk 命令對文件中的每條記錄執行一次模式/操作語句。
  • NF: NF 命令記錄當前輸入記錄中的字段數。
  • FS: FS 命令包含字段分隔符,用於劃分輸入行上的字段。默認為“空白”,表示空格和製表符。FS 可以重新分配給另一個字符(通常在 BEGIN 中)以更改字段分隔符。
  • RS: RS 命令存儲當前記錄分隔符。由於默認情況下輸入行是輸入記錄,因此默認記錄分隔符是換行符。
  • OFS: OFS 命令存儲輸出字段分隔符,用於在 Awk 打印字段時分隔字段。默認為空格。每當 print 有幾個用逗號分隔的參數時,它將在每個參數之間打印 OFS 的值。
  • ORS: ORS 命令存儲輸出記錄分隔符,用於在 Awk 打印輸出行時分隔它們。默認為換行符。print 自動輸出 ORS 的內容在它被打印的任何內容的末尾。

例子:

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

$ awk '{print NR,$0}' employee.txt

輸出:

1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000

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

用 NF 內置變量(顯示最後一個字段)

$ awk '{print $1,$NF}' employee.txt

輸出:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000

在上面的示例中,$1 代表姓名,$NF 代表薪水。我們可以使用 $NF 獲得薪水,其中 $NF 代表最後一個字段。

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

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt

輸出:

3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000

更多示例

對於給定的文本文件:

$cat > geeksforgeeks.txt

A B C
Tarun A12 1
Man B6 2
Praveen M42 3

1) 在 geeksforgeeks.txt 的每一行中打印第一項和行號 (NR),並用“-”分隔:

$ awk '{print NR "- " $1 }' geeksforgeeks.txt

1 - A
2 - Tarun
3 – Manav
4 - Praveen

2) 從 geeksforgeeks.txt 返回第二列/項目:

問題應該是:- 從 geeksforgeeks.txt 返回第二列/項目:

$ awk '{print $2}' geeksforgeeks.txt

B
A12
B6
M42

3)打印任何非空行(如果存在)

$ awk 'NF < 0' geeksforgeeks.txt

這裡 NF 應該不小於 0 並且用戶還必須打印行號:

正確答案:awk 'NF == 0 {print NR}' geeksforgeeks.txt

或者

awk 'NF <= 0 {print NR}' geeksforgeeks.txt

0

4) 要查找文件中存在的最長行的長度:

$ awk '{ if (length($0) > max) max = length($0) } END { print max }' geeksforgeeks.txt

13

5) 計算文件中的行數:

$ awk 'END { print NR }' geeksforgeeks.txt

3

6) 打印超過 10 個字符的行:

$ awk 'length($0) > 10' geeksforgeeks.txt

Tarun A12 1
Praveen M42 3

7)查找/檢查任何特定列中的任何字符串:

$ awk '{ if($3 == "B6") print $0;}' geeksforgeeks.txt

8) 要打印從 1 到 n 的第一個數字的平方,例如 6:

$ 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

本文由Anshika Goyal和Praveen Negi提供。如果您喜歡 GeeksforGeeks 並願意做出貢獻,您還可以使用write.geeksforgeeks.org撰寫文章或將您的文章郵寄至 review-team@geeksforgeeks.org。在 GeeksforGeeks 主頁上查看您的文章並幫助其他 Geeks。

如果您發現任何不正確的地方,或者您想分享有關上述主題的更多信息,請寫下評論。

begin

教程

ls

for

the

filename txt awk

txt awk print

getline

printf

gene