国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片

Awk 備忘清單

這是 GNU awk 的單頁快速參考備忘單,其中涵蓋了常用的 awk 表達式和命令。

入門

試試

該程序可用于選擇文件中的特定記錄并對其執(zhí)行操作

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

---
-F:冒號作為分隔符
{...}awk 程序
print打印當前記錄
$1第一個字段
$NF最后一個字段
/etc/passwd輸入數(shù)據(jù)文件

Awk 程序

BEGIN          {<初始化>} 
   <pattern 1> {<計劃動作>} 
   <pattern 2> {<計劃動作>} 
   ...
END            {< 最后的動作 >}

示例

awk '
    BEGIN { print "\n>>>Start" }
    !/(login|shutdown)/ { print NR, $0 }
    END { print "<<<END\n" }
' /etc/passwd

變量

          $1      $2/$(NF-1)    $3/$NF
           ▼          ▼           ▼ 
        ┌──────┬──────────────┬───────┐
$0/NR ? │  ID  │  WEBSITE     │  URI  │
        ├──────┼──────────────┼───────┤
$0/NR ? │  1   │  baidu.com   │  awk        ├──────┼──────────────┼───────┤
$0/NR ? │  2   │  google.com  │  25        └──────┴──────────────┴───────┘

# 第一個和最后一個字段
awk -F: '{print $1,$NF}' /etc/passwd
# 帶行號
awk -F: '{print NR, $0}' /etc/passwd
# 倒數(shù)第二個字段
awk -F: '{print $(NF-1)}' /etc/passwd
# 自定義字符串
awk -F: '{print $1 "=" $6}' /etc/passwd

查看: Awk 變量

Awk 程序示例

awk 'BEGIN {print "hello world"}'        # 打印 "hello world"
awk -F: '{print $1}' /etc/passwd         # -F: 指定字段分隔符
# /pattern/ 僅對匹配的模式執(zhí)行操作
awk -F: '/root/ {print $1}' /etc/passwd                     
# BEGIN 塊在開始時執(zhí)行一次
awk -F: 'BEGIN { print "uid"} { print $1 }' /etc/passwd     
# END 塊在最后執(zhí)行一次
awk -F: '{print $1} END { print "-done-"}' /etc/passwd

條件

awk -F: '$3>30 {print $1}' /etc/passwd

查看: Conditions 條件

生成 1000 個空格

awk 'BEGIN{
    while (a++ < 1000)
        s=s " ";
    print s
}'

查看: Loops

數(shù)組 Arrays

awk 'BEGIN {
   fruits["mango"] = "yellow";
   fruits["orange"] = "orange"
   for(fruit in fruits) {
     print fruit " 的顏色是 " fruits[fruit]
   }
}'

查看: Awk 數(shù)組

函數(shù) Functions

# => 5
awk 'BEGIN{print length("hello")}'
# => HELLO
awk 'BEGIN{print toupper("hello")}'
# => hel
awk 'BEGIN{print substr("hello", 1, 3)}'

查看: Functions

Awk 變量

內(nèi)置變量

:-:-
$0全線
$1, $2...$NF第一個,第二個……最后一個字段
NR記錄總數(shù)(Number of Records)
NFN個字段(Nnumber of Fields)
OFSOutput Field Separator
輸出字段分隔符 (default " ")
FSinput Field Separator
輸入字段分隔符 (default " ")
ORSOutput Record Separator
輸出記錄分隔符 (default "\n")
RSinput Record Separator
輸入記錄分隔符 (default "\n")
FILENAME文件名

表達式

:-:-
$1 == "root"第一個字段等于根
{print $(NF-1)}倒數(shù)第二個字段
NR!=1{print $0}從第 2 條記錄開始
NR > 3從第 4 條記錄開始
NR == 1第一次記錄
END{print NR}總記錄
BEGIN{print OFMT}輸出格式
{print NR, $0}行號
{print NR " " $0}行號(選項卡)
{$1 = NR; print}用行號替換第一個字段
$NF > 4最后一個字段 > 4
NR % 2 == 0甚至記錄
NR==10, NR==20記錄 10 到 20
BEGIN{print ARGC}arguments
ORS=NR%5?",":"\n"連接記錄

示例

打印總和和平均值

awk -F: '{sum += $3}
     END { print sum, sum/NR }
' /etc/passwd

打印參數(shù)

awk 'BEGIN {
    for (i = 1; i < ARGC; i++)
        print ARGV[i] }' a b c

輸出字段分隔符為逗號

awk 'BEGIN { FS=":";OFS=","}
    {print $1,$2,$3,$4}' /etc/passwd

匹配位置

awk 'BEGIN {
    if (match("One Two Three", "Tw"))
        print RSTART }'

匹配時長

awk 'BEGIN {
    if (match("One Two Three", "re"))
        print RLENGTH }'

僅限 GNU awk

:-:-
ENVIRON環(huán)境變量
IGNORECASE忽略大小寫
CONVFMT轉(zhuǎn)換格式
ERRNO系統(tǒng)錯誤
FIELDWIDTHS固定寬度字段

環(huán)境變量

:-:-
ARGC數(shù)字或參數(shù)
ARGV參數(shù)數(shù)組
FNR文件記錄數(shù)(File Number of Records)
OFMT數(shù)字格式 (default "%.6g")
RSTART字符串中的位置
RLENGTH比賽時長
SUBSEP多維數(shù)組分隔符 (default "\034")
ARGIND參數(shù)索引

定義變量

awk -v var1="Hello" -v var2="Wold" '
    END {print var1, var2}
' </dev/null

使用 shell 變量

awk -v varName="$PWD" '
    END {print varName}' </dev/null

Awk 運算符

運算符

:-:-
{print $1}第一個字段
$2 == "foo"等于
$2 != "foo"不等于
"foo" in array在數(shù)組中

正則表達式

:-:-
/regex/行匹配
!/regex/行不匹配
$1 ~ /regex/字段匹配
$1 !~ /regex/字段不匹配

更多條件

:-:-
($2 <= 4 || $3 < 20)或者
($1 == 4 && $3 < 20)

運算符

算術(shù)運算

  • +
  • -
  • *
  • /
  • %
  • ++
  • --

速記作業(yè)

  • +=
  • -=
  • *=
  • /=
  • %=

比較運算符

  • ==
  • !=
  • <
  • >
  • <=
  • >=

示例

awk 'BEGIN {
    if ("foo" ~ "^fo+$")
        print "Fooey!";
}'

不匹配

awk 'BEGIN {
    if ("boo" !~ "^fo+$")
        print "Boo!";
}'

如果在數(shù)組中

awk 'BEGIN {
    assoc["foo"] = "bar";
    assoc["bar"] = "baz";
    if ("foo" in assoc)
        print "Fooey!";
}'

Awk 函數(shù)

常用功能

函數(shù)描述
index(s,t)字符串 s 中出現(xiàn)字符串 t 的位置,如果未找到則為 0
length(s)字符串 s 的長度(如果沒有 arg,則為 $0)
rand01 之間的隨機數(shù)
substr(s,index,len)返回從索引開始的 slen-char 子字符串(從 1 開始計數(shù))
srandrand 設(shè)置種子并返回之前的種子
int(x)x 截斷為整數(shù)值
split(s,a,fs)將字符串 s 拆分為數(shù)組 afs 拆分,返回 a 的長度
match(s,r)字符串 s 中出現(xiàn)正則表達式 r 的位置,如果未找到,則為 0
sub(r,t,s)t 替換為字符串 s 中第一次出現(xiàn)的正則表達式 r(如果未給出 s,則替換為 $0)
gsub(r,t,s)t 替換字符串 s 中所有出現(xiàn)的正則表達式 r
system(cmd)執(zhí)行cmd并返回退出狀態(tài)
tolower(s)字符串 s 轉(zhuǎn)小寫
toupper(s)字符串 s 轉(zhuǎn)大寫
getline$0 設(shè)置為當前輸入文件中的下一個輸入記錄

用戶定義函數(shù)

awk '
    # 返回最小數(shù)量
    function find_min(num1, num2){
       if (num1 < num2)
       return num1
       return num2
    }
    # 返回最大數(shù)量
    function find_max(num1, num2){
       if (num1 > num2)
       return num1
       return num2
    }
    # 主功能
    function main(num1, num2){
       result = find_min(num1, num2)
       print "Minimum =", result
      
       result = find_max(num1, num2)
       print "Maximum =", result
    }
    # 腳本執(zhí)行從這里開始
    BEGIN {
       main(10, 60)
    }
'

Awk 數(shù)組

帶索引的數(shù)組

awk 'BEGIN {
    arr[0] = "foo";
    arr[1] = "bar";
    print(arr[0]); # => foo
    delete arr[0];
    print(arr[0]); # => ""
}'

帶鍵的數(shù)組

awk 'BEGIN {
    assoc["foo"] = "bar";
    assoc["bar"] = "baz";
    print("baz" in assoc); # => 0
    print("foo" in assoc); # => 1
}'

帶拆分的數(shù)組

awk 'BEGIN {
    split("foo:bar:baz", arr, ":");
    for (key in arr)
        print arr[key];
}'

帶有排序的數(shù)組

awk 'BEGIN {
    arr[0] = 3
    arr[1] = 2
    arr[2] = 4
    n = asort(arr)
    for (i = 1; i <= n ; i++)
        print(arr[i])
}'

多維

awk 'BEGIN {
    multidim[0,0] = "foo";
    multidim[0,1] = "bar";
    multidim[1,0] = "baz";
    multidim[1,1] = "boo";
}'

多維迭代

awk 'BEGIN {
    array[1,2]=3;
    array[2,3]=5;
    for (comb in array) {
        split(comb,sep,SUBSEP);
        print sep[1], sep[2], 
        array[sep[1],sep[2]]
    }
}'

Awk 條件

if-else 語句

awk -v count=2 'BEGIN {
    if (count == 1)
        print "Yes";
    else
        print "Huh?";
}'

三元運算符

awk -v count=2 'BEGIN {
    print (count==1) ? "Yes" : "Huh?";
}'

存在

awk 'BEGIN {
    assoc["foo"] = "bar";
    assoc["bar"] = "baz";
    if ("foo" in assoc)
        print "Fooey!";
}'

不存在

awk 'BEGIN {
    assoc["foo"] = "bar";
    assoc["bar"] = "baz";
    if ("Huh" in assoc == 0 )
        print "Huh!";
}'

switch

awk -F: '{
    switch (NR * 2 + 1) {
        case 3:
        case "11":
            print NR - 1
            break
        case /2[[:digit:]]+/:
            print NR
        default:
            print NR + 1
        case -1:
            print NR * -1
    }
}' /etc/passwd

Awk 循環(huán)

for...i

awk 'BEGIN {
    for (i = 0; i < 10; i++)
        print "i=" i;
}'

1 到 100 之間的 2 的冪

awk 'BEGIN {
    for (i = 1; i <= 100; i *= 2)
        print i
}'

for...in

awk 'BEGIN {
    assoc["key1"] = "val1"
    assoc["key2"] = "val2"
    for (key in assoc)
        print assoc[key];
}'

Arguments

awk 'BEGIN {
    for (argnum in ARGV)
        print ARGV[argnum];
}' a b c

示例

反向記錄

awk -F: '{ x[NR] = $0 }
    END {
        for (i = NR; i > 0; i--)
        print x[i]
    }
' /etc/passwd

反向字段

awk -F: '{
    for (i = NF; i > 0; i--)
        printf("%s ",$i);
    print ""
}' /etc/passwd

按記錄求和

awk -F: '{
    s=0;
    for (i = 1; i <= NF; i++)
        s += $i;
    print s
}' /etc/passwd

總結(jié)整個文件

awk -F: '
    {for (i = 1; i <= NF; i++)
        s += $i;
    };
    END{print s}
' /etc/passwd

while

awk 'BEGIN {
    while (a < 10) {
        print "- " " concatenation: " a
        a++;
    }
}'

do...while

awk '{
    i = 1
    do {
        print $0
        i++
    } while (i <= 5)
}' /etc/passwd

Break

awk 'BEGIN {
    break_num = 5
    for (i = 0; i < 10; i++) {
        print i
        if (i == break_num)
            break
    }
}'

Continue

awk 'BEGIN {
    for (x = 0; x <= 10; x++) {
        if (x == 5 || x == 6)
            continue
        printf "%d ", x
    }
    print ""
}'

Awk 格式化打印

用法

右對齊

awk 'BEGIN{printf "|%10s|\n", "hello"}'
# |     hello|

左對齊

awk 'BEGIN{printf "|%-10s|\n", "hello"}'
# |hello     |

通用說明符

特征符描述
cASCII 字符
d十進制整數(shù)
e, E, f浮點格式
o無符號八進制值
s細繩
%文字百分比

Space 空間

awk -F: '{
    printf "%-10s %s\n", $1, $(NF-1)
}' /etc/passwd | head -n 3

輸出

root       /root
bin        /bin
daemon     /sbin

Header 標題頭

awk -F: 'BEGIN {
    printf "%-10s %s\n", "User", "Home"
    printf "%-10s %s\n", "----","----"}
    { printf "%-10s %s\n", $1, $(NF-1) }
' /etc/passwd | head -n 5

輸出

User       Home
----       ----
root       /root
bin        /bin
daemon     /sbin

各種各樣的

正則表達式元字符

  • \
  • ^
  • $
  • .
  • [
  • ]
  • |
  • (
  • )
  • *
  • +
  • ?

轉(zhuǎn)義序列

:-:-
\b退格
\f換頁
\n換行(換行)
\r回車
\t水平選項卡
\v垂直選項卡

運行腳本

$ cat demo.awk
#!/usr/bin/awk -f
BEGIN { x = 23 }
      { x += 2 }
END   { print x }
$ awk -f demo.awk /etc/passwd
69

另見