awk語法-01-基礎(chǔ)語法(命令、選項、內(nèi)部變量)

1. 語法

awk [選項] '命令' 文件名

下邊我們分別對 選項、命令內(nèi)置變量詳細說明。

2. 命令

2.1 {} 每行操作

  • 語法示例
awk '{每行處理}' 文件名
  • 示例
[root@liubei ~]#  awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7

2.2 BEGIN{} 讀入前操作

  • 語法示例
awk 'BEGIN{開始時處理};{每行處理}' 文件名
  • 完整示例

用BEGIN打印一個簡單“表頭”

[root@liubei ~]# awk -F : 'BEGIN{printf "|%-20s|%-20s\n======================================\n","Name","Id"};{printf "|%-20s|%-20s\n",$1,$3}' /etc/passwd
|Name                |Id
======================================
|root                |0
|bin                 |1
|daemon              |2
|adm                 |3
|lp                  |4
|sync                |5
|shutdown            |6
|halt                |7
|mail                |8
|operator            |11
|games               |12
|ftp                 |14
|nobody              |99
|systemd-network     |192
|dbus                |81
|polkitd             |999
|sshd                |74
|postfix             |89
|chrony              |998
|cloud_user          |1000

2.3 END{} 讀入后操作

  • 語法示例
awk 'END{結(jié)尾時處理};{每行處理}' 文件名
  • 完整示例

給表格加一個結(jié)尾

[root@liubei ~]# awk -F : 'BEGIN{printf "|%-20s|%-20s\n=======================================\n","Name","Id"};{printf "|%-20s|%-20s\n",$1,$3};END{printf "======================================\n%30s \n","MAINTAINER: liuBei"}' /etc/passwd
|Name                |Id
=======================================
|root                |0
|bin                 |1
|daemon              |2
|adm                 |3
|lp                  |4
|sync                |5
|shutdown            |6
|halt                |7
|mail                |8
|operator            |11
|games               |12
|ftp                 |14
|nobody              |99
|systemd-network     |192
|dbus                |81
|polkitd             |999
|sshd                |74
|postfix             |89
|chrony              |998
|cloud_user          |1000
======================================
            MAINTAINER: liuBei

3. 選項

3.1 -F 分隔符

  • 語法
awk -F 分隔符
  • 完整示例
[root@liubei ~]#  awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7

3.2 -f 指定awk腳本

語法

  • 方法一
awk -f 腳本文件名 文件名
  • 方法二
./腳本文件名 文件名

完整示例(awk -f)

  • 創(chuàng)建腳本文件 myAwk.awk
#!/bin/awk -f
BEGIN{
  line="============================================";
  printf "|%-20s|%-20s\n%s\n","Name","Id",line
}

{
  printf "|%-20s|%-20s\n",$1,$3
}

END{
  line="============================================";
  printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}

說明:在腳本中,變量只能寫在每個模塊中。如果要統(tǒng)一寫,我們會在后文 -v 選項中使用。

  • 執(zhí)行和結(jié)果
[root@liubei ~]# awk -F : -f myAwk.awk /etc/passwd
|Name                |Id
============================================
|root                |0
|bin                 |1
|daemon              |2
|adm                 |3
|lp                  |4
|sync                |5
|shutdown            |6
|halt                |7
|mail                |8
|operator            |11
|games               |12
|ftp                 |14
|nobody              |99
|systemd-network     |192
|dbus                |81
|polkitd             |999
|sshd                |74
|postfix             |89
|chrony              |998
|cloud_user          |1000
============================================
                      MAINTAINER: liuBei

完整示例(直接執(zhí)行腳本)

如果腳本文件的內(nèi)容足夠,我們可以不使用awk -f,而直接執(zhí)行腳本

  • 創(chuàng)建腳本文件 myAwk.awk,并給執(zhí)行權(quán)限。
#!/bin/awk -f
BEGIN{
  FS=":";
  line="============================================";
  printf "|%-20s|%-20s\n%s\n","Name","Id",line
}

{
  printf "|%-20s|%-20s\n",$1,$3
}

END{
  line="============================================";
  printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}

說明:在腳本中,變量只能寫在每個模塊中。如果要統(tǒng)一寫,我們會在后文 -v 選項中使用。

  • 執(zhí)行和結(jié)果
[root@liubei ~]#./myAwk.awk /etc/passwd
|Name                |Id
============================================
|root                |0
|bin                 |1
|daemon              |2
|adm                 |3
|lp                  |4
|sync                |5
|shutdown            |6
|halt                |7
|mail                |8
|operator            |11
|games               |12
|ftp                 |14
|nobody              |99
|systemd-network     |192
|dbus                |81
|polkitd             |999
|sshd                |74
|postfix             |89
|chrony              |998
|cloud_user          |1000
============================================
                      MAINTAINER: liuBei

3.3 -v 變量使用

語法示例

awk -v key=value ……

完整示例

  • wak腳本

我們在命令行傳入變量,因此腳本中不用在寫變量了。

#!/bin/awk -f
BEGIN{
  printf "|%-20s|%-20s\n%s\n","Name","Id",line
}

{
  printf "|%-20s|%-20s\n",$1,$3
}

END{
  printf "%s\n%40s \n",line,"MAINTAINER: liuBei"
}
  • 執(zhí)行和結(jié)果
[root@liubei ~]# awk -F : -v line="============================================"  -f myAwk.awk /etc/passwd
|Name                |Id
============================================
|root                |0
|bin                 |1
|daemon              |2
|adm                 |3
|lp                  |4
|sync                |5
|shutdown            |6
|halt                |7
|mail                |8
|operator            |11
|games               |12
|ftp                 |14
|nobody              |99
|systemd-network     |192
|dbus                |81
|polkitd             |999
|sshd                |74
|postfix             |89
|chrony              |998
|cloud_user          |1000
============================================
                      MAINTAINER: liuBei

4. 內(nèi)部變量

下邊換了一臺服務(wù)器,示例輸出會和之前有出入。

4.1 顯示行、列數(shù)

變量 作用 備注
NR 顯示記錄號 即,改記錄是處理的第幾行
FNR 按文件顯示記錄號 即,該行是所在文件的第幾行
NF 顯示該列的字段數(shù) ——

NR 記錄處理的行號

[root@master-01 ~]# awk -F : '$1 ~ /root/{print NR,$0}' /etc/passwd /etc/shadow
1 root:x:0:0:root:/root:/bin/bash
30 root:$6$2fcntdFm$WWOEzr7r4BrkBOBz1k7Z.e04RVFU3PauaKr4ujKZ8xH/H2u/IF5NVesfHcexhsKzPi5nkXvgzgXDL75aCShjw0:18410:0:99999:7:::
root:$6$cIJxcczwzSZKnXO/$6lbW4FMYSqfjaMJzoLPTpYkXYXA/u/XN.edzv6O8eMHe.cwa19oyzXG5rOjR0ojoxPTBgfq1tSqJhFqEiRrVG.:19188:0:99999:7:::

說明:該命令我們處理了passwdshadow兩個文件,結(jié)果可見:

  • passwd中的root信息是該文件中第1行,也是本次處理的第1行。
  • shadow中的root信息是該文件的第1行,但它是命令中第21行處理的。

FNR 記錄文件中的行號

[root@master-01 ~]# awk -F : '$1 ~ /root/{print FNR,$0}' /etc/passwd /etc/shadow
1 root:x:0:0:root:/root:/bin/bash
1 root:$6$2fcntdFm$WWOEzr7r4BrkBOBz1k7Z.e04RVFU3PauaKr4ujKZ8xH/H2u/IF5NVesfHcexhsKzPi5nkXvgzgXDL75aCShjw0:18410:0:99999:7:::

上文我們可知,雖然shadow的root是第30行處理的,但是FNR記錄的是它在文件中的位置,因此FNR值是1

NF 記錄該行的字段數(shù)

[root@master-01 ~]# awk -F : '{print $0,NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash 7
bin:x:1:1:bin:/bin:/sbin/nologin 7
daemon:x:2:2:daemon:/sbin:/sbin/nologin 7
adm:x:3:4:adm:/var/adm:/sbin/nologin 7
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7
sync:x:5:0:sync:/sbin:/bin/sync 7

如上可見,passwd文件每行都是7個字段

4.2 格式化輸出

變量 作用 備注
FS 輸入字段分隔符(相當(dāng)于-F)
OFS 輸出字段分隔符 注意是輸出時的分隔符,不會改變原有分隔符
RS 輸入記錄換行符
ORS 輸出記錄換行符

FS 輸入字段分隔符

[root@master-01 ~]# awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5

OFS輸出字段分隔符

[root@master-01 ~]# awk 'BEGIN{FS=":";OFS="-"} {print $1,$3}' /etc/passwd
root-0
bin-1
daemon-2
adm-3
lp-4
sync-5

如上可見,輸出的字段分隔符是-。

  • 注意:此處是輸出時的分隔符,不會改變原有分隔符

如下例,雖然輸出分隔符改變了,但打印$0時顯示的原有分隔符仍然是:

[root@master-01 ~]# awk 'BEGIN{FS=":";OFS="-"} {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

RS 輸入記錄換行符

[root@master-01 ~]# awk 'BEGIN{RS=":"} {print $0}' /etc/passwd
root
x
0
0
root
/root
/bin/bash
bin
x
1
1
bin
/bin
/sbin/nologin
daemon
x
2
2
daemon
/sbin
/sbin/nologin
adm

如上可見,:被當(dāng)成了換行符,因此一行只有一個字段。

ORS 輸出記錄換行符

[root@master-01 ~]# awk 'BEGIN{ORS="\n--------------------------------------\n"} {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
--------------------------------------
bin:x:1:1:bin:/bin:/sbin/nologin
--------------------------------------
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--------------------------------------
adm:x:3:4:adm:/var/adm:/sbin/nologin
--------------------------------------
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
--------------------------------------
sync:x:5:0:sync:/sbin:/bin/sync
--------------------------------------

如上可見,輸出的換行符是 兩個換行符中間夾一橫線。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容