Loading

学习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,或者其他命令使用可以实现更简洁准确的查询。
今天的笔记先写到这里,如果笔记中有不够详细的地方或者知识欢迎评论!!

posted @ 2022-08-13 10:38  knsec  阅读(43)  评论(0编辑  收藏  举报