Shell编程 第五章 三剑客grep、sed、awk

一、shell 编程-grep

grep命令是Globally search a Regular Expression and Print的缩写,表示进行全局的正则匹配并进行打印。grep的相关扩展命令egrep其中egrep支持更多的正则匹配。

  • 语法:
grep [选项] '关键字' 文件名
  • 常用选项
参数用法
-v取反,表示反向查找
-i忽略大小写
-r-[ r | R ]表示递归查询
-w按单词搜索
-o打印匹配关键字
-c统计匹配到的次数
-n显示行号
-r逐层遍历目录查找
-A显示匹配行及后面多少行
-B显示匹配行及前面多少行
-C显示匹配行前后多少行
-l只列出匹配的文件名
-L列出不匹配的文件名
-e使用正则匹配
-E使用扩展正则匹配
^key以关键字开头
key$以关键字结尾
^$匹配空行
-color=auto可以将找到的关键字加上颜色的显示
  • 实例
[root@localhost ~]$ grep '^#' /etc/ssh/ssh_config       #过滤以#号开头的行
[root@localhost ~]$ grep -v '^#' /etc/ssh/ssh_config    #-v:取反,表示反向查找
[root@localhost ~]$ grep 'sendenv' /etc/ssh/ssh_config 
[root@localhost ~]$ grep -i 'sendenv' /etc/ssh/ssh_config  #-i忽略大小写
[root@localhost ~]$ grep  'bash' /opt/test/             #过滤某个目录下面带有bash的行
[root@localhost ~]$ grep  -r 'bash' /opt/test/          #-[r|R]表示递归查询

二、shell 编程-sed

1、简介

sed:stream editor(流编辑器)的缩写是一种在线非交互式编辑器,它一次处理一行内容。这样不断重复,直到文件末尾。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

由于sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改原文件

  • 语法
sed -r '匹配内容'  file_name
-r:支持扩展正则,在实际使用的时候,都会加上 -r 参数,即使没有用的扩展正则也不会有任何影响。

2、工作流程

在这里插入图片描述

  • 首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间)
  • 然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上

2、常用选项

参数用法
-e匹配多个命令
-f指定sed脚本的文件名
-ised默认是不会修改文件内容的,-i会直接修改文件内容
-nsed默认输出全部内容,-n是只输出匹配到的内容,这个选项一般只用于查看
  • 实例
示例文件
[root@localhost ~]# vim test.txt
MA Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA 
MA Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Ma Road, mA Falls PA 
Eric Adams, 20 Post Road, Sudbury mA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Ma Pkwy, Mountain View CA 
Sal Carpenter, 73 MA Street, Boston MA

1.搜索每一行匹配到MA的将第一个替换为Massachusetts:
[root@localhost ~]# sed -r 's/MA/Massachusetts/' test.txt
s:----查找

2.搜索每一行,找到所有的MA字符,进行全局替换为Massachusetts
[root@localhost ~]# sed -r 's/MA/Massachusetts/g' test.txt

3.搜索每一行,找到所有的MA字符,进行全局替换为Massachusetts同时忽略大小写
[root@localhost ~]# sed -r 's/MA/Massachusetts/gi' test.txt
-i:忽略大小写


4.-n   静默输出(不打印默认输出)
[root@localhost ~]# sed  -r -n 's/MA/Massachusetts/' test.txt


5.-e   使用多重指令:给予sed多个命令的时候需要-e选项
$ sed -r -e 's/MA/Massachusetts/' -e 's/PA/Pennsylvania/' test.txt

6.-f   使用脚本文件:当有多个要编辑的项目时,可以将编辑命令放进一个脚本里,再使用sed搭配-f选项 
-f <script文件> 以选项中指定的script文件来处理输入的文本文件。

[root@localhost ~]# vim s.sed
s/MA/Massachusetts/ 
s/PA/Pennsylvania/ 
s/CA/California/ 
s/VA/Virginia/ 
s/OK/Oklahoma/
 
[root@localhost ~]# sed -f s.sed test.txt
保存输出:
[root@localhost ~]# sed -f s.sed test.txt > newfile.txt


7.-i    会使得sed用修改后的数据替换原文件
[root@localhost ~]# sed -r -i 's/MA/Massachusetts/gi' test.txt

由于在使用 -i 参数时比较危险
我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔
[root@localhost ~]# sed -r -i.bak 's/root/ROOT/' passwd

3、sed中的编辑命令(以下所有的动作都要在单引号里)

参数用法
a追加 向匹配行后面插入内容
c更改 更改匹配行的内容
i插入 向匹配行前插入内容
d删除,删除选择的行。
s替换指定字符,一般格式为s///g
p打印 打印出匹配的内容,通常与-n选项和用
=用来打印被匹配的行的行号
n读取下一行,遇到n时会自动跳入下一行
r,w读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
  • 增删改查实例
🎈前提:vim a.txt  
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1


对文件进行增、删、改、查操作
🎈p 打印文件内容
sed ''  a.txt                         对文件什么都不做
sed -n 'p'  a.txt                     打印每一行,并取消默认输出
sed -n '1p'  a.txt                    打印第1行
sed -n '2p'  a.txt                    打印第2行
sed -n '1,5p'  a.txt                  打印1到5行
sed -n '$p' a.txt                     打印最后1行

🎈增加文件内容
i  在当前行上面插入文本
sed -r '2i\222222' a.txt              在第2行插入

a  在当前行下面插入文本
sed '$a99999' a.txt              文件最后一行下面增加内容
sed 'a99999' a.txt                文件每行下面增加内容
sed '5a99999' a.txt               文件第5行下面增加内容
sed '$i99999' a.txt               文件最后一行上一行增加内容
sed 'i99999' a.txt                文件每行上一行增加内容
sed '6i99999' a.txt               文件第6行上一行增加内容
sed '/^adm/ihello'                以adm开头行的上一行插入内容

🎈c 替换指定的整行内容
sed '5chello world' a.txt       替换文件第5行内容
sed 'chello world' a.txt        替换文件所有内容
sed '1,5chello world' a.txt     替换文件1到5号内容为hello world
sed '/^daemon/c888888' a.txt    替换以user01开头的行

🎈d 删除文件内容
sed '1d' a.txt                   删除文件第1行
sed '1,5d' a.txt                 删除文件1到5行
sed '$d' a.txt                   删除文件最后一行
sed '1~2d' a.txt                 删除奇数行,间隔两行删除
sed '0~2d' a.txt                 删除偶数行,从0开始间隔2行删除

4、 地址(定址)

地址用于决定对哪些 进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件中的所有行。

[root@localhost ~]# head /etc/passwd > passwd  #生成测试文件

[root@localhost ~]# sed -r '1d' passwd   #d:表示删除-- 删除文件的第1行 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# sed -r '1,2d' passwd #删除文件的第1-2行 daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# cat 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 
...
[root@localhost ~]# sed -r '2,$d' passwd     #删除第2行到最后一行
root:x:0:0:root:/root:/bin/bash 

[root@localhost ~]# sed -r '/^root/d' passwd    #匹配到root开头的行,删除此行
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# sed -r '/root/d' passwd  #含有root的行都删除
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# sed -r '/bash/,3d' passwd  #匹配到bash行,从此行到第3行删除
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@localhost ~]# cat -n 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
[root@localhost ~]# sed -r '1~2d' passwd   #删除奇数行,间隔两行删除
bin:x:1:1:bin:/bin:/sbin/nologin 
adm:x:3:4:adm:/var/adm:/sbin/nologin 
sync:x:5:0:sync:/sbin:/bin/sync 
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# sed '0~2d' passwd    #删除偶数行,从0开始间隔2行删除
passwd root:x:0:0:root:/root:/bin/bash  
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

5、常规操作

[root@localhost ~]# cp /etc/ssh/ssh_config .

1.删除配置文件中 # 号注释的行
[root@localhost ~]# sed -ri '/^#/d' ssh_config

2.给文件行添加注释:
[root@localhost ~]# sed -r '2,5s/^/#/' passwd
给所有行添加注释:
[root@localhost ~]# sed -r 's/^/#/' passwd

3.给文件行添加和取消注释
[root@localhost ~]# sed -ri s/^#baseurl/baseurl/g /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# sed -r s/^mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-Base.repo

三、shell编程之awk

1、awk简介

  • awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自一个或多个文件,或其它命令的输出。可以在命令行中使用,但更多是作为脚本来使用。

  • awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行操作。如果没有指定模式,则所有被操作所指定的行都被处理。

  • awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。

  • awk处理过程: 依次对每一行进行处理,然后输出,默认分隔符是空格或者tab键

(1)语法格式
awk [options] 'commands' filenames

-F:对于每次处理的内容,可以指定一个自定义的输入字段分隔符,默认的分隔符是空白字符(空格或 tab 键 )
(2)工作原理
awk -F ":"  '{print $1,$3}' /etc/passwd

(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束 
(2)然后,行被空格分解成字段,每个字段存储在已编号的变量中,从$1开始
  • 命令
BEGIN{}                   {}               END{}         filename
行处理前的动作          行内容处理的动作     行处理之后的动作    文件名

🎈 BEGIN{}和END{} 是可选项。
🎈 函数-BEGIN{}:读入文本之前要操作的命令。
🎈 {}:主输入循环:用的最多。读入文件之后擦操作的命令。如果不读入文件都可以不用写。
🎈 END{}:文本全部读入完成之后执行的命令。
  • 示例
[root@awk ~]# awk 'BEGIN{ print 1/2} {print "ok"} END{print "----"}' /etc/hosts
或者:
[root@awk ~]# cat /etc/hosts | awk 'BEGIN{print 1/2} {print "ok"} END{print "----"}'
0.5
ok
ok
----

2、print 和 printf

(1)关于 print

print 根据 awk 的匹配规则,匹配到需要的数据,然后使用 print 打印出来!

print 在打印字段的时候,需要使用 “,”(逗号) 隔开字段 ,各个字段都会 自动转换成字符串格式,然后根据 自定义的内置变量“OFS”(默认值为 空格) 的值来连接输出的各个字段的字符串!

print 要输出的数据被称之为 “记录”,在print 输出时,会在后面自动加上 输出记录分隔符“ORS” ,它的值默认为换行符 “\n”。

(2)关于printf

printf 是根据我们自己设定的格式来输出文本。然鹅,说到输出文本,就会想到另一个常用输出命令:echo。

很清楚的看到,echo 自动给输出的文本进行换行,而 printf 却没有。如果想换行只能结合换行符 “\n”来换行。
在这里插入图片描述

(3)关于格式化字符:
格式替换符作用
%s字符串
%f %F浮点格式
%g %G浮点格式 或 科学计数格式(输出为数字自己本身)
%b相对应的参数中包含转义字符时,使用此符号进行替换,对应的转义字符就会被转义
%c显示对应参数的第一个字符
%d %i转换为 整数,但不是四舍五入的结果(23.999 会输出为 23)
%o将 正整数 识 别为八进制数,然后再转换为十进制的方式输出
%u十进制
%x %X十六进制
%%表示 % 本身
(4)关于转义字符

printf 没有自动换行 的功能,要想换行我们得搭配转义字符 “\n” 来换行。

符号作用
\n换行
\f换页
\r回车
\t水平制表(跳到下一个 tab位置)
\v垂直制表
\代表 \ 自己本身
\’ " ?依次代表 单引号、双引号、问号
\0空字符
(5)关于修饰符

注意:修饰符 均放在 格式化字符 的前面!

修饰符作用
宽度宽度用数字表示(格式:%ns,n为正整数 )表示输出后的字符所占的宽度(上面图中有举例)
-使用 “-” 为左对齐,而不加 “-” 默认为右对齐
+对于数值。对于正数,表示为 正号,对于负数,没有效果
空格针对于数值。对于正数,输出结果前加一个 “ ”(空格),对于负数,没有效果
0只对 右对齐的输出结果有效,然后使用 0 来填充左边。
单引号 ’只对数值有效,结果是 在数值的千分位处(也就是一串数字的每个第四位处)加一个逗号
%10s   表示: 当前替换符对应的 输出宽度 为10。
 
%-10s  表示:“-” 这个符号表示输出的结果为 左对齐,不加 “-” 默认为右对齐!

3、记录与字段相关内部变量

  • 常用变量
变量作用
$n表示第几个变量,如:$1,$2,就表示第一个变量,第二个变量
$0表示执行过程中当前行的全部内容,即,所有的变量值
$NF表示最后一个变量
NR表示记录数,即当前执行的行号
FNR同NR,这个是相对于文件而言的
NF表示字段个数
FS字段分隔符,默认是任何的空格
RS记录分隔符,默认是一个换行符
OFS输出字段分隔符,默认是一个空格
ORS输出记录分隔符,默认是换行符
  • 不常用变量
变量作用
ARGC命令行参数的数量
ARGV命令行参数的数组
ARGIND命令行当前文件的位置(从0开始)
CONVFMT数字转换格式(默认为:%.6g)
OFMT数字的输出格式(默认是:%.6g)
ENVIRON环境变量关联数组
ERRNO最后一个系统错误描述
FIELDWIDTHS字段宽度列表(空格分隔)
FILENAME当前输入的文件的名字
IGNORECASE如果为真,就忽略大小写
RSTARTmatch函数匹配的字符串的第一个位置
RLENGTHmatch函数匹配的字符串的长度
SUBSEP数组下标分隔符(默认是34)
  • 实例
FS(输入字段分隔符)---一般简写为-F(属于行处理前)
[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1,$2}'
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
[root@awk ~]# cat /etc/passwd | awk -F":" '{print $1,$2}'
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x

#注:如果-F不加默认为空格区分!
===============================================================
OFS(输出字段分隔符)
[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}'
root..x
bin..x
daemon..x
adm..x
lp..x
sync..x
shutdown..x
halt..x
mail..x
======================================================================
1.创建两个文件
[root@awk ~]# vim a.txt
love
love.
loove
looooove


[root@awk ~]# vim file1.txt
isuo
IPADDR=192.168.246.211
hjahj123
GATEWAY=192.168.246.1
NETMASK=255.255.255.0
DNS=114.114.114.114

NR   表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号
[root@awk ~]# awk '{print NR,$0}' a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5  
6 isuo
7 IPADDR=192.168.246.211
8 hjahj123
9 GATEWAY=192.168.246.1
10 NETMASK=255.255.255.0
11 DNS=114.114.114.114

FNR:表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号(#会将不同文件分开)
[root@awk ~]# awk '{print FNR,$0}' a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5  
1 isuo
2 IPADDR=192.168.246.211
3 hjahj123
4 GATEWAY=192.168.246.1
5 NETMASK=255.255.255.0
6 DNS=114.114.114.114
===========================================================
RS(输入记录分隔符)
1.创建一个文件
[root@awk ~]# vim passwd
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
[root@awk ~]# cat passwd | awk 'BEGIN{RS="bash"} {print $0}' 
root:x:0:0:root:/root:/bin/
bin:x:1:1:bin:/bin:/sbin/nologin

ORS(输出记录分隔符)
2.对刚才的文件进行修改
[root@awk ~]# vim passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@awk ~]# cat passwd | awk 'BEGIN{ORS=" "} {print $0}'
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
===========================================================
NF:统计字段的个数
[root@awk ~]# cat /etc/passwd | awk -F":" '{print NF}'
7
7
7
7
$NF:打印最后一列
[root@awk ~]# cat /etc/passwd | awk -F":" '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin

4、在awk中使用if条件判断

🎈if基本语句
       {if(表达式){语句;语句;...}

🎈ifelse…的语法 
       {if (条件){语句1;语句2;…}else{语句1;语句2;…}}

🎈ifelse ifelse的语法
       {if (条件1){语句1;语句2;…}else if(条件2){语句1;语句2;…}else{语句1;语句2;…}}
  • 实战案例
1、显示管理员用户姓名
$ cat /etc/passwd | awk -F":" '{if($3==0) {print $1 " is administrator"}}'

2、统计系统用户数量
$ cat /etc/passwd | awk -F":" '{if($3>=0 && $3<=1000){i++}} END{print i}'

3、根据"uid=0"则打印用户名:超级管理员、普通管理员
$ cat /etc/passwd | awk -F ":" '{if($3 == 0){printf "%-10s\t%-10s\n",$1,":超级管理员"}else{printf "%-10s\t%-10s\n",$1,":普通管理员"}}' 

注:"%-10s\t%-10s\n"  格式化输出

5、在awk中使用for循环

for 循环有两种语法格式:
 
🎈格式1:
{for (初始化;布尔表达式;表达式){语句…}} 
 
🎈格式2:
{for(变量 in 数组){语句…}}
每行打印两遍
[root@qfedu ~]# awk '{for(i=1;i<=2;i++) {print $0}}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

6、在awk中使用while循环

🎈while 循环语法:
       
{while(布尔表达式){语句…}}
    
       
🎈do while 循环语法:
       
{do {代码语句…}while(条件)}
  • while 循环实例

在这里插入图片描述

当 while 对应的条件满足的时候,则执行后面的语句,每执行一次对条件进行一次更改,直到执行完毕后终止循环。(如上图所示,第一次执行的条件是 i=1,第二次执行的条件是 i=2…直到最后 i=10的时候,执行完毕就终止循环!)

7、数组遍历(数组)

用来统计网站日志的访问量
(for循环直接去找的是数组的索引,而不会找他的具体值)

++i:从1开始加,运算在赋值
i++: 从0开始加,赋值在运算
#按索引遍历:
1.先创建一个test文件,统计用户的数量
# vim test.txt  #将文件内容的第一个字段作为数组的值,通过索引获取到值
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
# cat test.txt | awk -F":" '{username[x++]=$1} END{for(i in username) {print i,username[i]}}'
0 root
1 bin
#注意:变量i是索引

8、相关Linxu命令

(1) uniq、sort、wc
  • -k:指定列数
  • -r:降序
  • -n:以数值来排序

uniq :将重复的数据仅列出一个显示,消除重复行

  • -i 忽略大小写字符的不同
  • -c 进行计数
  • -d 只显示重复出现的行列

wc:统计文件里有多少行、多少字、多少字符

  • -l 仅列出行
  • -w 仅列出多少字(英文单词)
  • -m 多少字符
(2)实例
把要统计的对象作为索引,最后对他们的值进行累加,累加出来的这个值就是你的统计数量

1. 统计/etc/passwd中各种类型shell的数量
# cat /etc/passwd | awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }'

2.统计nginx日志出现的状态码
# cat access.log | awk '{stat[$9]++} END{for(i in stat){print i,stat[i]}}'

3.统计当前nginx日志中每个ip访问的数量
# cat access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'

4.统计某一天的nginx日志中的不同ip的访问量
# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' 

5.统计nginx日志中某一天访问最多的前10个ip
# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' |sort -k2 -rn | head -n 10


6.统计tcp连接的状态---下去自己查各个状态,包括什么原因造成的!
# netstat -n | awk '/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}'
LAST_ACK 5 (正在等待处理的请求数)
SYN_RECV 30
ESTABLISHED 1597 (正常数据传输状态)
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)

9、经典案例(pv、uv)

UV与PV统计
PV:即访问量,也就是访问您商铺的次数;
例如:今天显示有300 PV,则证明今天你的商铺被访问了300次。
================================================================
UV:即访问人数,也就是有多少人来过您的商铺;  #需要去重
例如:今天显示有50 UV,则证明今天有50个人来过你的商铺。
=================================================================
1.根据访问IP统计UV
# cat access.log | awk '{print $1}' |sort |uniq | wc -l
uniq:去重
-c:统计每行连续出现的次数
2.更具访问ip统计PV
# cat access.log | awk '{print $1}' |wc -l
或者是url
# cat access.log | awk '{print $7}' |wc -l
3.查询访问最频繁的URL
# cat access.log | awk '{print $7}'|sort | uniq -c |sort -n -k 1 -r | more
4.查询访问最频繁的IP
# cat access.log | awk '{print $1}'|sort | uniq -c |sort -n -k 1 -r | more
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值