awk入门

第1章 awk主要内容

取列  统计 计算

  1. 执行过程
  2. '找谁{干啥}'

'模式{动作}'

  1. 正则表达式作为条件
  2. 从哪里来,到哪里去条件(范围)
  3. BEGIN 和END
  4. awk数组-进行统计

1.1 awk的执行过程

[root@hsots ~]# awk -F: 'NR==2{print $NF}' passwd.txt

/sbin/nologin

1.2 '模式{动作}'

     '条件/找谁{动作}'

1.3 awk眼中的 行与列

 field     字段,列

record     记录,行

awk默认有一把菜刀 - 空格系列(单独的空格,连续的空格,tab键)

-F 指定分隔符

-F: === -vFS=":"    OFS ===output field separator 输出每一列的的时候使用的分割符号

awk的内置变量 

FS

NF ------number of field 每一行有多少列

NR ------number ofrecord  记录号 行号

$数字   取某一列

$0      取出这一行

RS ------每一行的分隔符(每一行的结束标记)换行符

OFS

1.4 正则表达式的使用

^   某一列以...开头

$   某一列以...结尾

1.4.1 #awk函数 

gsub(r,s [, t])  

gsub(/找谁/,"替换成什么" ,替换那部分的内容)

测试环境

mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
Zhang Dandan    41117397   :250:100:175
Zhang Xiaoyu    390320151  :155:90:201
Meng  Feixue    80042789   :250:60:50
Wu    Waiwai    70271111   :250:80:75
Liu   Bingbing  41117483   :250:100:175
Wang  Xiaoai    3515064655 :50:95:135
Zi    Gege      1986787350 :250:168:200
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
EOF

 awk中正则的使用

[root@hsots ~]# awk '/Li/' /server/files/reg.txt

Liu   Bingbing  41117483   :250:100:175

Li    Youjiu    918391635  :175:75:300

显示出第二列是包含X

[root@hsots ~]# awk '$2~/X/' /server/files/reg.txt

Zhang Xiaoyu    390320151  :155:90:201

Wang  Xiaoai    3515064655 :50:95:135

显示Xiaoyu的姓氏和ID号码

[root@hsots ~]# awk '$2~/Xiaoyu/{print $1,$3}' /ses/reg.txt

Zhang 390320151

显示所有ID号码最后一位数字是1或5的人的全名

[root@hsots ~]# awk '$3~/[15]$/{print $1,$2}' iles/reg.txt

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai

姓氏是Zhang的人,显示他的第二次捐款金额及她的名字

[root@hsots ~]# awk -F "[ :]+" '$1~/Zhang/{print $1$2,$(NF-1)}' /server/files/reg.txt

ZhangDandan 100

ZhangXiaoyu 90

显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135 

[root@hsots ~]# awk '$2~/Xiaoyu/ {gsub (/:/,"$",$NF);print $NF}' /server/files/reg.txt

$155$90$201

写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字

~   包含
!~不包含
[root@oldboyedu-40 files]# awk -F: '$NF!~/nologin$/{print $1,$NF}' /etc/passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
oldboy /bin/bash
lidao /bin/bash
alex888 /bin/bash
user01 /bin/bash
user02 /bin/bash
user03 /bin/bash
oldboy1978 /bin/bash
stu01 /bin/bash
stu02 /bin/bash
stu03 /bin/bash
kaifa /bin/bash

column -t    对齐

1.5 特殊条件 BEGIN END

1.5.1 #BEGIN{}  BEGIN里面的内容会在 awk读取文件之前 运行

##测试 进行计算

[root@hsots ~]# awk 'BEGIN{print 1/3}'

0.333333

##BEGIN里面定义awk内置变量

-F: ====   -vFS=":" ===== BEGIN{FS=":"}

##

[root@oldboyedu-40 files]# awk 'BEGIN{print "姓氏","名字"}{print $1,$2}' reg.txt

姓氏 名字

Zhang Dandan

Zhang Xiaoyu

Meng Feixue

Wu Waiwai

Liu Bingbing

Wang Xiaoai

Zi Gege

Li Youjiu

1.5.2 END{}  END里面的内容 会在awk读取完文件内容后执行

   ##先计算然后在END里面输出结果

   ##先计算在输出

企业案例:统计出/etc/services文件里面的空行数量

[root@hsots ~]# awk '/^$/{i++}END{print i}' /etc/services

 seq100 >num.txt 计算这个文件每一行数字相加的结果

[root @hsots ~]# awk '{i=i+$1}END {print i}' num.txt

5050

i=i+1 ====i++  统计数量 计数

i=i+$0 累计相加 累加

1.6 awk数组

分类计算

统计图片.jpg出现了多少次

统计视频.avi出现了多少次

$7~/.jpg/{a++}$7~/.avi/{b++}

假设我们的酒店

酒店<===>hotel

酒店里面有几个房间110,119,120,114,401这几个房间。

酒店的110房间<===> hotel[110]

酒店的119房间<===> hotel[119]

酒店的120房间<===> hotel[121]

酒店房间里面入住客人

hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin"

 

[root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

> print hotel[110],hotel[119],hotel[121]}'

lidao tanjiaoshou taojin

 

#自动显示房间的内容

awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

for(pol in hotel)  #for pol in 1 2 3 4 5

print pol,hotel[pol]

}'

 

 

for(pol in hotel)  pol变量对酒店进行循环/查房

 

print pol,hotel[pol]

#pol 得到-房间的号码

#hotel[pol]    哪个酒店的哪个房间

 

[root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

for(pol in hotel)

print pol,hotel[pol]

}'

110 lidao

121 taojin

119 tanjiaoshou

 

##hotel -------数组的名字

##110 119 121 -数组元素的下标(名字)

##hotel[110]  -房间里面的内容

企业面试题1:统计域名访问次数
处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

方法1

[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort

mp3.etiantian.org

post.etiantian.org

post.etiantian.org

www.etiantian.org

www.etiantian.org

www.etiantian.org

[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq

mp3.etiantian.org

post.etiantian.org

www.etiantian.org

[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq -c

      1 mp3.etiantian.org

      2 post.etiantian.org

      3 www.etiantian.org

#sort 排序 默认是按照字母顺序

#uniq 合并 把相邻的的的一模一样的行 合并 -c显示重复的数量

方法2 awk数组

[root@hsots ~]# awk -F "[/]+" '{i[$2]++}END{for (a in i) print a ,i[a]}' 1.txt |column -t

mp3.etiantian.org   1

post.etiantian.org   2

www.etiantian.org  3

第2章 课后题目

2.1 统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)

[root@hsots ~]# awk '$6~/Failed/{i[$(NF-3)]++}END{for (a in i)print a ,i[a]}' secure-20161219 |column -t|sort -nrk2|head

2.2 统计access.log文件中对ip地址去重并统计重复数

[root@hsots ~]# awk '{i[$1]++}END{for (a in i)print a ,i[a]}' access.log |sort -nk2|column -t

2.3 统计access.log文件中网站一共使用了多少流量

[root@hsots ~]#  awk '{i=i+$10}END{print i}' access.log

2478496663

2.4 统计access.log文件中每个ip地址使用了多少流量

[root@hsots ~]# awk '{i[$1]=i[$1]+$10}END{for(a in i)print a,i[a]}' access.log|column -t

 

原文地址:https://www.cnblogs.com/dzc-/p/9754791.html