1.字段的理解

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

在学习之前先熟悉一个字段:/etc/passwd中的字段

/etc/passwd中,每行包含7个字段(从1开始数共7个),他们分别代表:用户名:密码:用户ID:组ID:描述:主目录:默认shell
第二个字段就是密码,一般加密后放在/etc/shadow里;

具体的详细信息如下:
1)“用户名”是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(,因为冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)“口令”一些系统中,存放着加密后的用户口令字。。虽然这个字段存放的只是用户口令的加密串,不是
明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多 Linux
系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字
段中只存放一个特殊的字符,例如“x”或者“*”。

3)“用户标识号”是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)“组标识号”字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。

5)“注释性描述”字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux
系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)“主目录”,也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而
用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。
Shell 是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell),
csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell),
bash(Bourne Again
Shell)等。系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
cat /etc/group
组名:加密密码:组ID:所有属于该组的用户。

在对/etc/passwd 和/etc/passwd字段中的内容了解了之后,进入主题:

2.入门实例

awk ‘{pattern + action}’ {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,一个Pattern是一个正则表达式经编译后的表现模式。而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

注:awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

#awk -F: ‘/root/’ /etc/passwd

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

搜索支持正则,例如找root开头的:
awk -F: ‘/^root/’ /etc/passwd

搜索/etc/passwd有root关键字的所有行,并显示对应的shell

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割:

另外的:
假设last -n 5的输出如下:

如果只是显示最近登录的5个帐号

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加”blue,/bin/nosh”。

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,0则表示所有域,1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

3.awk内置变量

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

使用printf替代print,可以让代码更加简洁,易读
awk -F ‘:’ ‘{printf(“filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n”,FILENAME,NR,NF,$0)}’ /etc/passwd

下面做个awk 内置变量 NF NR的小实验:
1)NF:
grep “Failed” /var/log/secure:

grep “Failed” /var/log/secure | awk ‘{print $(NF-3)}’:

NF-3的意思是倒数第三个字段,ssh2是第-0个字段,663951是第-1个字段….192.168.33.20是第-3个字段。

同理# grep “Failed” /var/log/secure | awk ‘{print $(NF-9)}’结果为:

它和# grep “Failed” /var/log/secure | awk ‘{print $(5)}’命令结果是一样的:

上面的例子是NF,也就是{NF} ,也就是NF,如果是NF就不同了,NF就代表被(默认)空格分开的域的个数:

2)NR:
NR代表执行的行数:也就是假如bbb.log的文本有如下内容:
111b

222b
那么:grep “1” bbb.log | awk ‘{print NR}’
就会返回:1
那么:grep “2” bbb.log | awk ‘{print NR}’
就会返回:2
那么:grep “b” bbb.log | awk ‘{print NR}’
就会返回:
1
2

假设bbb.log的文本有如下内容:
111b

222b
333c
444d
555b
grep “b” bbb.log | awk ‘{print NR}’
返回:
1
2
3

为什么是1 2 3 而不是1 2 5 不是行数么?

因为grep “b” bbb.log的结果是:
111b
222b
555b
然后这个结果管道给awk的,所以1 2 3。

4.awk编程

变量和赋值
除了awk的内置变量,awk还可以自定义变量。
下面统计/etc/passwd的账户人数

awk ‘{count++;print $0;} END{print “user count is “, count}’ /etc/passwd


count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。

这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
awk ‘BEGIN {count=0;print “[start]user count is “, count} {count=count+1;print $0;} END{print “[end]user count is “, count}’ /etc/passwd

统计某个文件夹下的文件占用的字节数:
ls -l |awk ‘BEGIN {size=0;} {size=size+$5;} END{print “[end]size is “, size}’

如果以M为单位显示:
ls -l |awk ‘BEGIN {size=0;} {size=size+$5;} END{print “[end]size is “, size/1024/1024,”M”}’

条件语句
awk中的条件语句是从C语言中借鉴来的,见如下声明方式:

if (expression) {statement;statement;... ...
}if (expression) {statement;
} else {statement2;
}if (expression) {statement1;
} else if (expression1) {statement2;
} else {statement3;

例如,统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):
ls -l |awk ‘BEGIN {size=0;print “[start]size is “, size} {if($5!=4096){size=size+$5;}} END{print “[end]size is “, size/1024/1024,”M”}’

循环语句
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

数组
因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

下面使用for循环遍历数组,显示/etc/passwd的账户:
awk -F ‘:’ ‘BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}’ /etc/passwd

awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html

linux awk详解相关推荐

  1. Linux三剑客之awk详解

    第一篇 awk简介与表达式实例 一种名字怪异的语言 模式扫描和处理,处理数据和生成报告. awk不仅仅是linux系统中的一个命令,而且是一种编程语言:它可以用来处理数据和生成报告(excel):处理 ...

  2. php 字符流在linux,PHP_linux正则表达式awk详解,awk和sed一样是流式编辑器,它 - phpStudy...

    linux正则表达式awk详解 awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用 ...

  3. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...

  4. Linux proc详解

    本文转自:http://hi.baidu.com/beyond907/blog/item/250f41249c9fbb7435a80fd2.html Linux procfs详解 1.0 proc文件 ...

  5. 《Linux命令详解手册》——Linux畅销书作家又一力作

    关注IT,更要关心IT人,让系统管理员以及程序员工作得更加轻松和快乐.鉴于此, 图灵公司引进了国外知名出版社John Wiley and Sons出版的Fedora Linux Toolbox: 10 ...

  6. Linux系统详解 系统的启动、登录、注销与开关机

    Linux系统详解 第六篇:系统的启动.登录.注销与开关机 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://johncai.blo ...

  7. 每天一个linux命令(25):linux文件属性详解

    每天一个linux命令(25):linux文件属性详解 Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下 ...

  8. Linux系统结构 详解

    Linux系统结构 详解 标签: 产品产品设计googleapple互联网 2011-01-07 14:14 31038人阅读 评论(6) 收藏 举报 分类: Linux(21) 版权声明:本文为博主 ...

  9. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.2 DDR2 SDRAM芯片

    本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...

最新文章

  1. ubuntu16.04下Sublime Text3中文无法输入解决方法和创建桌面快捷方式
  2. STM32F4 HAL库开发 -- RTC
  3. php5.1 0day,DEDECMS 5.1 feedback_js.php 0DAY
  4. 微服务化后缓存怎么做?
  5. vector中resize和reserve接口的异同
  6. python安装盒怎么打开_安装MySQL-python报错
  7. 日本台式计算机配置,电脑配置
  8. c++ c超简单的求公约数
  9. 论文笔记_S2D.03-2012-BMVC-目标类别分割和稠密立体重建的联合优化
  10. 【转】flash不建议设置wmode及wmode解释
  11. PolyCode编译(Linux)
  12. html+css实现淘宝右侧固定定位导航
  13. ios、android、h5、小程序等安卓苹果平台终端兼容问题
  14. IDEA中自动导包快捷键
  15. rmmod不能卸载驱动
  16. 用python分析股票收益影响因素的方法_【Python】用Python分析股票的收益和风险
  17. 如何查找Steam好友代码(以及添加好友代码)
  18. oracle 2的22次方,22的2次方(2的22的2次方等于多少)
  19. 批处理从入门到精通_DOS/BAT
  20. 【peoplesoft】Integration Gateway - General Error (158,10201)错误

热门文章

  1. breakout room at teams
  2. why do you want to university of cambridge?
  3. Node.js 第二个思路
  4. Mckinsey insights 2
  5. 订体育馆订健身房的方法
  6. 危机永远回来,只是什么时候的问题
  7. mac开发的时候必须要xcode
  8. 2021第三封拒信来自哈佛大学计算机科学与技术专业~
  9. 破解visual sourcesafe数据库admin用户密码
  10. IPv6网络协议的安全疑云