学习Linux-关于AWK 命令笔记
Linux 关于AWK 命令,语法,示例
一. awk简介
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
它可以依次处理文件的每一行,并读取里面的每一个字段。对于日志这样的每行格式相同的文本文件,awk可能是最方便的工具。
1.awk语法
基于模式匹配检查输入文本,逐行处理并输出
格式1:前置命令 | awk 选项 ‘条件{指令}’
格式2:awk 选项 ‘条件{指令}’文件.. ..
其中print是最常用的编辑指令,若有多条指令用分号 ;分隔
awk过滤数据时支持仅打印某一列,如第2列、第4列等;
处理文件时,若未指定分隔符,则默认将空格、制表符(tab键)等作为分隔符;
内置变量;
$0 文件所有内容
$1 文件第一列
$2 文件第二列
...
NR 文件当前的行号
NF 文件当前行的列数
2.基本命令 awk ‘{指令}’ 文件名
[root@red-hat ~]# echo "this is my" | awk '{print $2}'
is
[root@red-hat ~]# awk '{print}' /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
.
.
.
```bash
[root@red-hat ~]# 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
.
.
.
由此得出结论 {print $0} 和{print} 效果是一样的
awk会根据空格和制表符(如:),将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等。
[root@red-hat ~]# awk -F ':' '{ print $1 }' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
先示例一下 把文件的行号打印出来,除第一列每两个冒号之间为一个字段
[root@red-hat ~]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- NR 的作用:是将符合的条件的行号打印出来
- 这个文件的字段分隔符是冒号(:),所以要用-F参数指定分隔符为冒号。然后,才能提取到它的第一个字段。
[root@red-hat ~]# awk -F: '$3<5{print NR}' /etc/passwd
1
2
3
4
5
- NF 的作用:打印当前行的全部字段总数
- 就是说这一行有多少列,就是分隔的字段有多少段(以冒号为准,可参考上方)
[root@red-hat ~]# awk -F: '{print NR,NF}' /etc/passwd
1 7
2 7
3 7
4 7
5 7
6 7
7 7
[root@red-hat ~]# awk -F: '{print "用户:",$1,"用户的解释器为:",$7}' /etc/passwd
用户: root 用户的解释器为: /bin/bash
用户: bin 用户的解释器为: /sbin/nologin
用户: daemon 用户的解释器为: /sbin/nologin
用户: adm 用户的解释器为: /sbin/nologin
用户: lp 用户的解释器为: /sbin/nologin
上面代码中,print命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。
print命令里面,如果原样输出字符,要放在双引号里面。
[root@red-hat ~]# awk -F ':' '{print NR ") " $1}' /etc/passwd
1) root
2) bin
3) daemon
4) adm
5) lp
6) sync
7) shutdown
三.awk 条件
1.多用于过滤机制
语法:
awk 选项 ‘BEGIN{指令} {指令} END{指令}’ 文件
awk 选项 ‘BEGIN{指令}’
awk ‘过滤前执行的指令{print $1} 过滤完要执行的指令’ 文件
x=10 bash中定义
a.赋值计算
[root@red-hat ~]# awk 'BEGIN{x=20;print x}'
20
[root@red-hat ~]# awk 'BEGIN{x=20;y=10;print x+y}'
30
b.通过awk统计系统中使用bash解释器的用户个数
[root@red-hat ~]# awk 'BEGIN{x=0}/bash/{x++}END{print x}' /etc/passwd
1
d.输出以root开头的行
[root@red-hat ~]# awk -F: '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@red-hat ~]# awk -F: '$1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
e.找出passwd文件中解释器不是以nologin结尾的行,打印用户名字段
[root@red-hat ~]# awk -F: '$7!~/nologin/{print $1,$7}' /etc/passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
f.输出账户UID大于10并且小于20的账户信息,打印用户名、UID、解释器
[root@red-hat ~]# awk -F: '$3>10 && $3<20 { print $1,$3,$7}' /etc/passwd
operator 11 /sbin/nologin
games 12 /sbin/nologin
ftp 14 /sbin/nologin
g.输出账户UID大于等于1000的账户信息,打印用户名、UID、解释器
[root@red-hat ~]#awk -F: '$3>=1000{print $1,$3,$7}' /etc/passwd
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
总结
awk命令可以用来过滤查询需要的信息,也可以用来完成 if 或是 for 循环的工作,搭配grep,或者其他命令使用可以实现更简洁准确的查询。
今天的笔记先写到这里,如果笔记中有不够详细的地方或者知识欢迎评论!!
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/p/16582278.html