awk编程语言/数据处理引擎
文章目录
一、简述:
1、基于模式匹配检查输入文本,逐行处理并输出
2、通常用在shell脚本中,获取指定数据
3、单独使用时,可对文本数据做统计
二、常用命令格式
1、前置命令 | awk [选项] ’[条件] {指令}’
2、awk [选项] ‘[条件] {指令}’ 文件路径
三、常用选项
1、-F:指定打印的分隔符,可省略(默认是空格和TAB位作为分隔符)
四、常用内置变量
1、FS:保存或设置字段分割符,例如FS=”:” ,与-F功能一样
2、$n:指定分隔的第n个字段,如$1、$2分别表示第一列、第二列
3、$0:表示当前读入文本里的整行内容
4、NF:表示当前读入文本里的列数
5、NR:表示当前读入文本里的行数
举例
(1)打印ens33网卡的IP地址,/ens33$/查找以ens33字符结尾的行,$2打印第二列,默认分隔符为空格。
[root@localhost ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7f:4c:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.8/24 brd 192.168.4.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::91e5:778d:5a20:5a4f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:09:b5:c0 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:09:b5:c0 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]$ ip a s | awk '/ens33$/{print $2}'
192.168.4.8/24
(2)打印CPU型号,当需要打印的内容包含多个空格时可以使用-F选项指定打印的分隔符为“:”,/Model name/指查找字符为Model name的行,$2打印第二列。
[root@localhost ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 151
Model name: 12th Gen Intel(R) Core(TM) i7-12700KF
Stepping: 2
CPU MHz: 3609.598
BogoMIPS: 7219.19
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 48K
L1i cache: 32K
L2 cache: 1280K
L3 cache: 25600K
NUMA node0 CPU(s): 0,1
[root@localhost ~]$ lscpu |awk -F: '/Model name/ {print $2}'
12th Gen Intel(R) Core(TM) i7-12700KF
(3):已“:”为分隔符,打印操作系统用户信息passwd.txt文件的行数(NR),列数(NF),以及文件的所有内容($0)
[root@localhost ~]# awk -F: '{print NR,NF,$0}' passwd.txt
1 7 root:x:0:0:root:/root:/bin/bash
2 7 bin:x:1:1:bin:/bin:/sbin/nologin
3 7 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 7 ntp:x:38:38::/etc/ntp:/sbin/nologin
5 7 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
6 7 gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
7 7 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
8 7 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
9 7 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
10 7 tcpdump:x:72:72::/:/sbin/nologin
11 7 lrh:x:1000:1000:lrh:/home/lrh:/bin/bash
12 7 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
(4)打印apache用户所在文本的行数以及整行内容
[root@localhost ~]$ awk -F: '/apache/{print NR,$0}' /etc/passwd
44 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
五、awk处理时机,可以安排额外的任务
- BEGIN{ }: 放在BEGIN花括号里的命令只会执行1次
- { }逐行任务: 放在花括号里的命令可执行n次,具体次数根据文本行数决定
- END{ }: 放在END花括号里的命令只会执行1次
- 举例:
- 文本内容如下:
cat ys.txt
keli 8 1.27 200
shenli 18 1.56 50000
zhongli 6000 1.86 0
kaiya 30 1.86 30000
ko