shell編程系列14--文本處理三劍客之awk的概述及經常使用方法總結

shell編程系列14--文本處理三劍客之awk的概述及經常使用方法總結


awk是一個文本處理工具,一般用於處理數據並生成結果報告
awk的命名是它的創始人 Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首個字母組成的

awk的工做模式

語法格式

第一種形式: awk 'BEGIN{}pattern{commands}END{}' file_name

BEGIN在匹配以前就執行的操做,pattern{commands}是對每一行的操做,END是匹配完後的操做

第二種形式: standard output | awk 'BEGIN{}pattern{commands}END{}'


語法格式說明

語法格式        說明
BEGIN{}        正式處理數據以前執行
pattern        匹配模式
{commands}    處理命令,可能多行
END{}        處理完全部匹配數據後執行

awk的內置變量

內置變量對照表(上)

內置變量    含義
$0        整行內容
$1-$n        當前行的第1-n個字段
NF        當前行的字段個數,也就是多少列
NR        當前的行號,從1開始計數
FNR        多文件處理時,每一個文件行號單獨計數,都是從0開始
FS        輸入字段分隔符。不指定默認以空格或tab鍵分割
RS        輸入行分隔符。默認回車換行
OFS        輸出字段分隔符。默認爲空格
ORS        輸出行分隔符。默認爲回車換行

內置變量對照表(下)

內置變量    含義
FILENAME    當前輸入的文件名字
ARGC        命令行參數個數
ARGV        命令行參數數組

總結:
    內置變量:
        $0                    打印行全部信息
        $1~$n                    打印行的第1到n個字段信息
        NF Number Field                處理行的字段個數
        NR Number Row                處理行的行號
        FNR File Number Row            多文件處理時,每一個文件單獨記錄行號
        FS Field Separator            字段分隔符,不指定時默認以空格或tab鍵分割
        RS Row Separator            行分隔符,不指定時以回車換行分割
        OFS Output Filed Separator        輸出字段分隔符
        ORS Output Row Separator        輸出行分隔符
        FILENAME                處理文件的文件名
        ARGC                    命令行參數個數
        ARGV                    命令行參數數組


# 輸出整行數據

[root@localhost shell]# awk '{print $0}' 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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ajie:x:1000:1000:ajie:/home/ajie:/bin/bash
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
deploy:x:1001:1001::/home/deploy:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

# FS指定分隔符
[root@localhost shell]# awk 'BEGIN{FS=":"}{print $1}' passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
ajie
chrony
deploy
nginx

# 默認以空格或者tab爲分隔符
[root@localhost shell]# cat list
Hadoop Spark Flume
Java Python Scala
Allen Mike Meggie
[root@localhost shell]# awk '{print $1}' list
Hadoop
Java
Allen
[root@localhost shell]# awk 'BEGIN{FS=" "}{print $1}' list
Hadoop
Java
Allen

# NF 輸出每一行的字段個數
[root@localhost shell]# cat list
Hadoop Spark Flume
Java Python Scala Golang
Allen Mike Meggie
[root@localhost shell]# awk '{print NF}' list
3
4
3

# NR 行號,處理多個文件(list,passwd,/etc/fstab)時行號累加
[root@localhost shell]# awk '{print NR}' list passwd /etc/fstab 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# FNR在處理兩個文件以上時會單獨計數
[root@localhost shell]# awk '{print FNR}' list passwd /etc/fstab 
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12


[root@localhost shell]# cat list
Hadoop|Spark:Flume
Java|Python:Scala:Golang
Allen|Mike:Meggie

# 以 | 符號分隔列
[root@localhost shell]# awk 'BEGIN{FS="|"}{print $2}' list
Spark:Flume
Python:Scala:Golang
Mike:Meggie
# 以 : 符號分隔列
[root@localhost shell]# awk 'BEGIN{FS=":"}{print $2}' list
Flume
Scala
Meggie

# RS 指定行分隔符: --
[root@localhost shell]# cat list
Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
[root@localhost shell]# awk 'BEGIN{RS="--"}{print $0}' list
Hadoop|Spark|Flume
Java|Python|Scala|Golang
Allen|Mike|Meggie

[root@localhost shell]# awk 'BEGIN{RS="--";FS="|"}{print $3}' list 
Flume
Scala
Meggie

# ORS輸出分隔符,以&鏈接各輸出行
[root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list
Flume&Scala&Meggie

# 字段默認分隔符是空格
[root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $1,$3}' list
Hadoop Flume&Java Scala&Allen Meggie
&

# OFS 指定字段分隔符爲 : 
[root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list
Hadoop:Flume&Java:Scala&Allen:Meggie
&

# FILENAME 文件名
[root@localhost shell]# awk '{print FILENAME}' list
list

# 輸出3次文件名list,是由於沒有輸入匹配模式 awk默認是行處理,文本有3行,處理三次會有3次輸出
[root@localhost shell]# cat list
Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
Test File
Line
[root@localhost shell]# awk '{print FILENAME}' list
list
list
list

# ARGC命令行參數個數
[root@localhost shell]# awk '{print ARGC}' list
2
2
2
[root@localhost shell]# awk '{print ARGC}' list /etc/fstab 
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3

# NF表示字段個數,NF=7 $NF 就是$7 表示最後一個字段
[root@localhost shell]# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/bin/bash
/sbin/nologin
相關文章
相關標籤/搜索