博客 / 詳情

返回

Linux命令—awk

作用:文本處理工具.

命令格式

awk Options 'Program-Text' InputFile1 InputFile2 ...

對輸入文件 InputFile1 InputFile2 ... 執行給定的程序 Program-Text.

常用選項

  • -F sep: 自定義字段分隔符為 sep.
  • -f ScriptFile: 從 ScriptFile 文件中讀取 awk 腳本.

記錄

默認的記錄分隔符為換行符.

可以通過內建變量 RS 來自定義記錄分隔符. RS 的值可以是單個字符,也可以是正則表達式.

如果將 RS 設為空字符串,則 awk 將以空白行來分割記錄,且以換行符作為字段分隔符.

字段

awk 將每個記錄分割為多個字段.

默認的字段分隔符是任意的空白符. 可以通過 -F 選項或 FS 內建變量來自定義字段分隔符.

FS 的值可以是單個字符,也可以是正則表達式.

如果 FIELDWIDTHS 變量被設置為以空格分隔的一系列數字,則每個字段將有對應數量的字符. 此時忽略 FS.

如果 FPAT 變量被設置為一個正則表達式,則每個字段將是匹配該正則的內容. FPAT 的優先級最低.

$0 代表整個記錄、$1 代表記錄中的第1個字段、$2 代表第2個字段、$11 代表第11個字段 ... ($ 只用於引用字段,使用變量時,直接使用變量名即可)

NF 變量的值是當前記錄中的字段數.

模式

Program-Text 為:

pattern {action1; action2; ...}

如果匹配模式,則執行指定的動作.

pattern 可以省略,此時將對每個記錄執行給定的動作.

pattern 可以取值如下:

  • BEGIN: 在讀取輸入之前執行.
  • END: 在處理完所有輸入之後執行.
  • BEGINFILE: 在讀取每個輸入文件之前執行.
  • ENDFILE: 在處理完每個文件之後執行.
  • /regular expression/: 只要記錄匹配給定的正則表達式就執行.
  • 模式也支持邏輯運算:

    pattern && pattern
    pattern || pattern
    !pattern
  • pattern1, pattern2: 從匹配第一個模式的地方開始至匹配第二個模式的地方結束,包括首尾.
  • $n ~ /pattern/: 只要第 n 個字段匹配指定的模式就執行.
  • $n !~ /pattern/: 只要第 n 個字段不匹配指定的模式就執行.

例子

[ming@localhost test]$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[ming@localhost test]$ awk -F : '{print $1}' /etc/passwd | head -3
root
bin
daemon
[ming@localhost test]$ cat script.awk
BEGIN {
        print "Start Processing ..."
}

BEGINFILE {
        printf "Start Processing %s ...\n", FILENAME
}

{
        print $1
}

ENDFILE {
        printf "Finish Processing %s!\n", FILENAME
}

END {
        print "Finish Processing!"
}

[ming@localhost test]$ cat data1.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
[ming@localhost test]$ cat data2.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k

[ming@localhost test]$ awk -f script.awk data1.txt data2.txt 
Start Processing ...
Start Processing data1.txt ...
1
a
Finish Processing data1.txt!
Start Processing data2.txt ...
1
a
Finish Processing data2.txt!
Finish Processing!

注意:模式必須和 { 位於同一行.

使用正則表達式:

[ming@localhost test]$ awk '/[a-z]/{print $1}' data1.txt 
a

[ming@localhost test]$ awk '!/[a-z]/{print $1}' data1.txt 
1

邏輯運算:

[ming@localhost test]$ cat data.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
10 a 20 b 30 c

[ming@localhost test]$ awk '$1 ~ /[0-9]/ && $2 !~ /[0-9]/{print $1}' data.txt 
10
user avatar huorongsecurity 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.