前言
我们将/etc/passwd文件拷贝到/data下做实验,以免影响系统
一、awk特点和应用场景
一门语言,类似于c语言
过滤、统计、计算
过滤统计日志
三个作者的名字缩写组成
二、awk执行

2.1 工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令;
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”再进行处理;
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示;
在使用awk命令的过程中,可以使用逻辑操作符“&&”表示与、“||”表示或、“!”表示非,还可以进行简单的数学运算如+-*/%^,分别表示加减乘除取余和乘方
2.2 命令格式
awk 选项 '模式或条件{操作}' 文件1 文件2
awk -f 脚本文件 文件1 文件2 ...
2.3 行与列
名词 | awk中的叫法 | 一些说明 |
行 | 记录record | 每一行默认通过回车分割的 |
列 | 字段,域 field | 每一列默认通过空格分割的 |
awk中默认的东西都是可以修改的
2.3.1 取行
awk |
|
NR==1 | 取出某一行 |
NR>=1&&NR<=5 | 取出1-5行范围 |
$0 | 整行 |
/old/ | 过滤 |
/100/,/110/ | 100到110行 |
符号 | <> >= <= == != |
#取第一行
[root@localhost data]# awk 'NR==1' users.txt
1,zhangsan
#取1-3行,空格可加可不加
[root@localhost data]# awk 'NR>=1 && NR<=3' users.txt
1,zhangsan
2,lisi
3,wangwu
#非文本内容取行
[root@localhost data]# ll |awk 'NR==2'
-rw-r--r--. 1 root root 172 4月 12 09:45 1.tar.gz
[root@localhost data]# ll |awk 'NR==2{print $0}'
-rw-r--r--. 1 root root 172 4月 12 09:45 1.tar.gz



2.3.2 取列
-F 指定分隔符, 指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字 取出某一列;注意:在awk中$内容就一个意思,表示取出某一列
column -t 文本对齐
$NF 表示最后一列
#取出ls -l 文件大小的那一列
[root@localhost data]# ll
总用量 44
-rw-r--r--. 1 root root 172 4月 12 09:45 1.tar.gz
-rw-r--r--. 1 root root 96 4月 20 15:16 config
-rw-r--r--. 1 root root 48 4月 12 09:45 host_ip
-rw-r--r--. 1 root root 70 4月 12 09:45 ip.txt
-rw-r--r--. 1 root root 81 4月 21 00:58 out1.txt
-rw-r--r--. 1 root root 79 4月 21 00:58 out2.txt
-rw-r--r--. 1 root root 2169 4月 19 14:59 passwd
-rw-r--r--. 1 root root 78 4月 21 00:53 script.sed
drwxr-xr-x. 8 root root 4096 4月 16 15:42 sh
drwxr-xr-x. 2 root root 240 4月 12 09:45 test
-rw-r--r--. 1 root root 54 4月 20 14:44 users.txt
-rw-r--r--. 1 root root 69 4月 15 12:38 丢包.txt
[root@localhost data]# ll |awk '{print $5}'
172
96
48
70
81
79
2169
78
4096
240
54
69
#查看大小和文件名,并对齐显示
[root@localhost data]# ll |awk '{print $5,$9}'
172 1.tar.gz
96 config
48 host_ip
70 ip.txt
81 out1.txt
79 out2.txt
2169 passwd
78 script.sed
4096 sh
240 test
54 users.txt
69 丢包.txt
[root@localhost data]# ll |awk '{print $5,$9}' |column -t
172 1.tar.gz
96 config
48 host_ip
70 ip.txt
81 out1.txt
79 out2.txt
2169 passwd
78 script.sed
4096 sh
240 test
54 users.txt
69 丢包.txt
#取出passwd的第一列和最后一列
[root@localhost data]# awk -F: '{print $1,$NF}' passwd |column -t
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
#将passwd的第一列和最后一列交换
[root@localhost data]# awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$1}' passwd
/bin/bash:x:0:0:root:root
/sbin/nologin:x:1:1:bin:bin
/sbin/nologin:x:2:2:daemon:daemon
/sbin/nologin:x:3:4:adm:adm
/sbin/nologin:x:4:7:lp:lp
/bin/sync:x:5:0:sync:sync
/sbin/shutdown:x:6:0:shutdown:shutdown
/sbin/halt:x:7:0:halt:halt
/sbin/nologin:x:8:12:mail:mail
/sbin/nologin:x:11:0:operator:operator
/sbin/nologin:x:12:100:games:games





说错了,是第一列和最后一列交换,只需$1和$NF

2.3.3 小结
行与列名称
awk取行与取列
取出网卡IP地址(同时取行取列)
#取出IP地址
[root@localhost data]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.109.131 netmask 255.255.255.0 broadcast 192.168.109.255
inet6 fe80::45b4:7459:c87e:dc54 prefixlen 64 scopeid 0x20<link>
[root@localhost data]# ifconfig |awk 'NR==2' |awk -F"[ ]+" '{print $3}'
192.168.109.131
[root@localhost data]# ifconfig |awk -F"[ ]+" 'NR==2{print $3}'
192.168.109.131
