第五章:三剑客之awk

第一节:awk简介

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

第二节:awk的常用内置变量

FS                 设置输入列分隔符,等价于命令行 -F选项
OFS                输出列分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
NF                 浏览记录的列的个数
NR                 已读的记录数(行号)
FNR                读取两个文件分别显示行号
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

实例:

[root@lb03 ~]# cat file.txt
/etc/sysconfig/network
[root@lb03 ~]# awk  'BEGIN{RS="/"}{print $0}'  file.txt  -->将/替换成了换行符

etc
sysconfig
network

[root@lb03 ~]# awk  'BEGIN{ORS="/"}{print $0}'  file.txt  -->将换行符替换为/
/etc/sysconfig/network/[root@lb03 ~]# 

第三节:awk的处理方式

1.BEGIN{}{}END{}

[root@lb03 ~]# awk  'BEGIN{print 1 + 1}{print $0}END{print "文件内容显示结束"}'   /etc/hosts
2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
文件内容显示结束

2.内置变量的使用

awk引用内部变量    -v 定义一个变量
[root@lb03 ~]# awk  -va=10 -vb=20 'BEGIN{print a + b}'
30               

3.变量的传递使用

[root@m01 /scripts]# IP=10.0.0.1       ———>定义外部变量IP
[root@m01 /scripts]# awk -v I=$IP 'BEGIN{print I}'  ———>将外部变量IP传递给内置变量I
10.0.0.1

第四节:awk结合正则用法

#匹配第四列中含有98的行
[root@lb03 ~]# awk -F:  '$4 ~/98/'  passwd        
polkitd:x:999:998:User for polkitd:/:/sbin/nologin

#匹配第四列中没有98的行(取反)
[root@lb03 ~]# awk -F:  '$4 !~/98/'  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

Awk示例1:解释其下列命令的含义
# awk '/west/' datafile          
# awk '/^north/' datafile
# awk '$3 ~ /^north/' datafile
# awk '/^(no|so)/' datafile
# awk '{print $3,$2}' datafile
# awk '{print $3 $2}' datafile
# awk '{print $0}' datafile
# awk '{print "Number of fields: "NF}' datafile
# awk '/northeast/{print $3,$2}' datafile
# awk '/^[ns]/{print $1}' datafile
# awk '$5 ~ /\. [7-9]+/' datafile
# awk '$2 !~ /E/{print $1,$2}' datafile
# awk '$3 ~ /^Joel/{print $3 "is a nice boy."}' datafile
# awk '$8 ~ /[0-9][0-9]$/{print $8}' datafile
# awk '$4 ~ /Chin$/{print "The price is $" $8 "."}' datafile
# awk '/Tj/{print $0}' datafile
# awk -F: '{print "Number of fields: "NF}' /etc/passwd
# awk -F "[ :]" '{print NF}' /etc/passwd

Awk示例2
[root@qls ~]# cat b.txt
web qiudao:is a:good boy!
[root@qls ~]# awk '{print NF}' b.txt
4
[root@qls ~]# awk -F ':' '{print NF}' b.txt
3
[root@qls ~]# awk -F"[ :]" '{print NF}' b.txt
6

第五节:awk的比较表达式

1.比较表达式

>       大于  
<       小于
>=      大于等于
<=      小于等于
==      等于
!=      不等于

2.实例

#双条件判断是否管理员用户
[root@lb03 ~]# awk  -F:  '$1 == "root"  &&  $3 == 0 '  passwd 
root:x:0:0:root:/root:/bin/bash

#统计系统用户有多少个
[root@lb03 ~]# awk -F:  '$3 > 0 && $3 < 1000 {print $1}'  passwd |wc -l
21
[root@lb03 ~]# awk -F:  '$3 > 0 && $3 < 1000 {i++}END{print i}'  passwd
21

#统计普通用户数量
[root@lb03 ~]# awk -F:  '$3 >= 1000  {i++}END{print i}'  passwd
10

#把用户的uid的值乘于10小于100的显示出来
[root@lb03 ~]# awk -F:  '$3 * 10 < 100{print $1}'  passwd 
bin
daemon
adm

第六节:awk结合语句用法

1.if else 判断语句

打印系统管理员用户的数量
[root@lb03 ~]# awk  -F:  '{if($3==0){i++}}END{print "管理员用户的数量为:"i}'  passwd
管理员用户的数量为:2

打印系统管理员的数量和其他用户的数量
[root@lb03 ~]# awk  -F:  '{if($3==0){i++}else {j++}}END{print "当前系统管理员用户数量为:"i;print "其他用户数量为:"j}'  passwd 
当前系统管理员用户数量为:2
其他用户数量为:29

打印系统管理员的数量和系统用户的数量及普通用户的数量
[root@lb03 ~]# awk  -F:  '{if($3==0){i++} else {if($3>0 && $3<1000){j++} else {o++}}}END{print "管理员用户的数量为:"i "  系统用户的数量为:"j" 普通用户的数量为:",o}'  passwd 
管理员用户的数量为:2  系统用户的数量为:19 普通用户的数量为: 10

2.for循环语句

创建10个用户
[root@lb03 ~]# awk  'BEGIN{for(i=1;i<=10;i++){print "useradd  old"i}}'   |bash
修改日期同时并创建一个文件
[root@lb03 ~]# awk  'BEGIN{for(i=1;i<15;i++){print "date -s 2019/11/"i" && touch  file-"i".txt"}}' |bash

3.while 循环语句用法

创建10个用户
[root@lb03 ~]# awk  'BEGIN{i=1;while(i<10){print "useradd  new"i;i++}}' |bash

第七节:awk数组

1.统计passwd文件中所有shell的数量
count   =====    echo  ${!count[*]}  ---->即索引下标

[root@lb03 ~]# awk -F:   '{count[$NF]++}END{for (i in count)print i,count[i]}'  passwd |sort -rnk2 |column  -t
/sbin/nologin   17
/bin/bash       11
/sbin/shutdown  1
/sbin/halt      1
/bin/sync       1

2.取出tcp的11种状态的数量
[root@lb03 ~]# ss  -ant |awk  'NR>1{state[$1]++}END{for (i in state)print i,state[i]}'
LISTEN 4
ESTAB 1

3.取出访问日志中每个ip的访问次数
[root@lb03 ~]# awk  '{ips[$1]++}END{for (i in ips)print i,ips[i]}'  access.log  |sort -rnk2  |head -4|column  -t
139.226.172.217  16033
47.102.42.79     1041
180.95.238.82    994
113.140.249.33   727

4.统计系统日志secure.log,破解密码失败的ip的次数
[root@lb03 ~]# awk '/Failed password/{ips[$(NF-3)]++}END{for (i in ips)print i,ips[i]}'  secure.log |sort -rnk2 |head -4|column -t
218.65.30.25    68652
218.65.30.53    34326
218.87.109.154  21201
112.85.42.103   18065

5.统计访问日志中每个ip的访问次数和每个ip对应返回的字节数量。
[root@lb03 ~]# awk  '{ips[$1]++;he[$1]+=$10}END{for (i in ips)print i,ips[i],he[i]}' access.log  |sort -rnk2 |head -4|column  -t
139.226.172.217  16033  749869585
47.102.42.79     1041   16462
180.95.238.82    994    154136
113.140.249.33   727    105270
#它们拥有相同的索引ip

6.每个IP访问状态码数量-->将$1和$9共同作为数组count的索引
[root@m01 /scripts]# awk  '{count[$1"  "$9]++}END{for (i in count)print i,count[i]}' access.log  |sort -rnk3  |column  -t |head
139.226.172.217           200       14731
47.102.42.79              200       1041
180.95.238.82             302       992
139.226.172.217           304       805
113.140.249.33            302       726
223.166.74.124            302       646
112.87.125.55             200       450
182.138.163.167           302       429
223.166.74.198            302       351
182.138.158.169           302       308

awk的字符串替换
https://www.jianshu.com/p/d90f8a2ecd62

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 文本处理三剑客3-Awk awk的用户使用指南[http://www.gnu.org/software/gawk/...
    孤独时代的痞子liu阅读 957评论 0 4
  • awk awk****推荐去看朱双印的博客“awk****从放弃到入门”,写的真的很好,本文的awk****就总结...
    凯睿看世界阅读 1,331评论 1 14
  • 直到今天清晨,我才知道妹纸名字,见面三次,也就二十四小时不到。站立在一捧荒草土丘前,倾斜墓碑模糊不清,依稀可见几字...
    隔屏打望阅读 400评论 0 1
  • SICP就是著名的《计算机程序的结构与解释》。本文罗列若干网络资料,给出一些学习建议。并呼吁大学新生尽快进入SIC...
    Bintou老师阅读 23,742评论 3 36
  • 1事件:妈妈的葬礼顺利完毕 2感受:惆怅,失落 3想法:人,是很缈小的,抗拒不了生与死,抗拒不了国家的政策及风头的...
    b0c03fa73869阅读 142评论 0 0