awk 语法与内置变量(一)

awk 是 Linux 一个很重要的文本和报告处理工具,可以处理复杂的文本,从中摘取所需数据,生成数据报告,可以称为 awk 编程。其名称来自于三个创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。

语法

第一种形式

awk 'BEGIN{} pattern {commands} END{}' obj_file

BEGIN 表示在正式处理文本前就要执行的指令,相应的 END 则表示处理完文本后需要执行的指令。中间部分表示对文本的处理,如果无需遍历整个文本而对特定行进行处理需要用到 pattern , commands 表示对经过 pattern 处理后匹配到的行再执行 commands 命令。如果不写 pattern 表示对每一行都进行处理。

第二种形式

对标准输出进行处理,跟 gerp 和 sed 类似。

std output | awk 'BEGIN{} pattern {commands} END{}'

内置变量

内置变量是 awk 预定义好的,内置在 awk 的变量。

$0

表示输出一整行,如果没有 pattern 作为限制,将输出若有内容。

awk '{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
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
pengbo:x:1000:1000:Peng Bo:/home/pengbo:/bin/bash
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nginx:x:1001:1001::/home/nginx:/bin/bash
bob:x:1002:1002::/home/bob:/bin/bash

$1-$n 与 FS

awk 字段默认分隔符为空格或者 tab 。trump.txt 文件内容如下

Donald trump accused of calling US war dead 'suckers and losers'.
Donald TRUMP accused of calling US war dead 'suckers and losers'.
Trump has a big mouth.

执行

awk '{print $1}' trump.txt 
Donald
Donald
Trump

etc/passwd 每行内容以 : 作为分隔,如果需要输出第 7 个字段的 shell ,需要先指定分隔符 FS ,如下

awk BEGIN'{FS=":"}{print $7}' /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/false
/bin/bash
/bin/bash

NF

显示每行的字段数,示例如下

awk '{print NF}' trump.txt 

输出

11
11
5

NR

显示每行的行号,示例如下

awk '{print NR}' trump.txt /etc/passwd

输出

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

FNR

多文件处理时,每个行号单独计算,从 1 开始,示例如下

awk '{print FNR}' trump.txt /etc/passwd

输出

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
23

RS

表示输入行分隔符,默认为回车,如果打算将其设置为 * ,示例如下

cat RS.txt 
abcde*fghij*klmno
awk 'BEGIN{RS="*"}{print $0}' RS.txt 
abcde
fghij
klmno
awk
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!