前言
我们将/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