Linux统计日志相关命令

对于运维或者开发人员来源,对于日志的统计和搜索是必会的技能,甚至在面试的时候是必问的问题,对此,做一下总结。

一、常用到的命令

1、cat
2、awk
一、语法形式 
awk [options] 'script' var=value file(s) 
awk [options] -f scriptfile var=value file(s) 
常用命令选项
 -F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: 
 -v var=value   赋值一个用户定义变量,将外部变量传递给awk 
 -f scripfile  从脚本文件中读取awk命令 
 -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

二、 awk内置变量(预定义变量)
 说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
 $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
 $0 这个变量包含执行过程中当前行的文本内容。 
[N] ARGC 命令行参数的数目。 
[G] ARGIND 命令行中当前文件的位置(从0开始算)。
[N] ARGV 包含命令行参数的数组。 
[G] CONVFMT 数字转换格式(默认值为%.6g)。 
[P] ENVIRON 环境变量关联数组。 
[N] ERRNO 最后一个系统错误的描述。 
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。 
[A] FILENAME 当前输入文件的名。 
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。 
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。 
[A] NF 表示字段数,在执行过程中对应于当前的字段数。 
[A] NR 表示记录数,在执行过程中对应于当前的行号。 
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。 
[A] ORS 输出记录分隔符(默认值是一个换行符)。 
[A] RS 记录分隔符(默认是一个换行符)。 
[N] RSTART 由match函数所匹配的字符串的第一个位置。 
[N] RLENGTH 由match函数所匹配的字符串的长度。 
[N] SUBSEP 数组下标分隔符(默认值是34)。

打印每一行的第二和第三个字段:
 awk '{ print $2,$3 }' filename 
统计文件中的行数: 
awk 'END{ print NR }’ filename

三、 awk的工作原理 
awk 'BEGIN{ commands } pattern{ commands } END{ commands }’ 
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 
第三步:当读至输入流末尾时,执行END{ commands }语句块。 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。 示例 echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' Start A line 1 A line 2 End 当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' v1 v2 v3 双引号拼接使用: echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3 { }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

3、sort -r
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:

   sort [-bcfMnrtk][源文件][-o 输出文件] 

补充说明:sort可针对文本文件的内容,以行为单位来排序。
参  数:

  -b   忽略每行前面开始出的空格字符。

  -c   检查文件是否已经按照顺序排序。

  -f   排序时,忽略大小写字母。

  -M   将前面3个字母依照月份的缩写进行排序。

  -n   依照数值的大小排序。

  -o<输出文件>   将排序后的结果存入指定的文件。

  -r   以相反的顺序来排序。

  -t<分隔字符>   指定排序时所用的栏位分隔字符。

  -k  选择以哪个区间进行排序。

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4、uniq -c
文字
uniq 是LINUX命令
用途
报告或删除文件中重复的行。
语法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
描述
uniq 命令删除文件中的重复行。
uniq 命令读取由 InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。)最后,uniq 命令将最终单独的行写入标准输出或由 OutFile 参数指定的文件。InFile 和 OutFile 参数必须指定不同的文件。如果输入文件用“- ”表示,则从标准输入读取;输入文件必须是文本文件。文本文件是包含组织在一行或多行中的字符的文件。这些行的长度不能超出 2048 个字节(包含所有换行字符),并且其中不能包含空字符。
缺省情况下,uniq 命令比较所有行。如果指定了-f Fields 或 -Fields 标志, uniq 命令忽略由 Fields 变量指定的字段数目。 field 是一个字符串,用一个或多个 <空格 > 字符将它与其它字符串分隔开。
如果指定了 -s Characters 或 -Characters 标志, uniq 命令忽略由 Characters 变量指定的字段数目。为 Fields 和 Characters 变量指定的值必须是正的十进制整数。
当前本地语言环境决定了 -f 标志使用的 <空白> 字符以及 -s 标志如何将字节解释成字符。
如果执行成功,uniq 命令退出,返回值 0。否则,命令退出返回值大于 0。
标志
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
-f Fields 忽略由 Fields 变量指定的字段数目。如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。这个标志和 -Fields 标志是等价的。
-s Characters 忽略由 Characters 变量指定的字符的数目。如果 Characters 变量的值超过输入行中的字符的数目, uniq 用空字符串进行比较。如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -s Characters 标志指定的字符的数目,而从由 -f Fields 标志指定的字段后开始。 这个标志和 +Characters 标志是等价的。
-Fields 忽略由 Fields 变量指定的字段数目。这个标志和 -f Fields 标志是等价的。
+Characters 忽略由 Characters 变量指定的字符的数目。如果同时指定 - Fields 和 +Characters 标志, uniq 命令忽略由 +Characters 标志指定的字符数目,并从由 -Fields 标志指定的字段后开始。 这个标志和 -s Characters 标志是等价的。
- c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
- d 只显示重复行 。
- u 只显示文件中不重复的各行 。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+ n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
- f n 与- n相同,这里n是字段数。
- s n 与+n相同,这里n是字符数。
退出状态
该命令返回以下退出值:
0 命令运行成功。
>0 发生错误。
补充
文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样

示例
要删除名为 fruit 文件中的重复行并将其保存到一个名为 newfruit 的文件中,输入:
uniq fruit newfruit
如果 fruit 文件包含下列行:
apples
apples
peaches
pears
bananas
cherries
cherries
则在您运行uniq 命令后 newfruit 文件将包含下列行:
apples
peaches
pears
bananas
cherries
文件/usr/bin/uniq 包含 uniq 命令。
# uniq -c  的用法,例如:
harley
casely
weedly
harley
linda
#cut -c 1-8 | sort | uniq -c > result.txt
1 casely
2 harley
1 linda
1 weekly
1. 显示文件example中不重复的行。
uniq - u example
2. 显示文件example中不重复的行,从第2个字段的第2个字符开始做比较。
uniq - u - 1 +1 example

5、head
6、tail
7、less
8、cut
cut 命令可以从一个文本文件或者文本流中提取文本列。
[root@www ~]# cut -d ' 分隔字符 ' -f fields <== 用于有特定分隔字符
[root@www ~]# cut -c 字符区间            <== 用于排列整齐的信息
选项与参数:
-d  :后面接分隔字符。与 - f 一起使用;
-f  :依据 -d 的分隔字符将一段信息分割成为数段,用 - f 取出第几段的意思;
-c  :以字符 (characters) 的单位取出固定字符区间;
  PATH 变量如下
[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/ games
# 1 | 2 | 3 | 4  | 5 | 6 | 7
  将 PATH 变量取出,我要找出第五个路径。
# echo $PATH | cut -d ' : ' -f 5
/usr/local/bin
  将 PATH 变量取出,我要找出第三和第五个路径。
# echo $PATH | cut -d ' : ' -f 3 , 5
/sbin:/usr/local/bin
  将 PATH 变量取出,我要找出第三到最后一个路径。
echo $PATH | cut -d ' : ' -f 3 -
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/ games
  将 PATH 变量取出,我要找出第一到第三个路径。
# echo $PATH | cut -d ' : ' -f 1 - 3
/bin:/usr/bin:/sbin:
  将 PATH 变量取出,我要找出第一到第三,还有第五个路径。
echo $PATH | cut -d ' : ' -f 1 - 3 , 5
/bin:/usr/bin:/sbin:/usr/local/bin
  实用例子:只显示/etc/passwd的用户和shell
# cat /etc/ passwd | cut -d ' : ' -f 1 , 7
root: /bin/ bash
daemon: /bin/ sh
bin: /bin/ sh

9、wc 
统计 文件里面有多少单词,多少行,多少字符。
wc语法
[root@www ~]# wc [- lwm]
选项与参数:
- l  :仅列出行;
- w   :仅列出多少字(英文单字);
-m  :多少字符;
默认使用wc统计/etc/passwd
# wc /etc/ passwd
40    45 1719 /etc/ passwd
40是行数,45是单词数,1719是字节数
wc的命令比较简单使用,每个参数使用如下:
# wc -l /etc/ passwd    #统计行数,在对记录数时,很常用
40 /etc/ passwd       #表示系统有40个账户
# wc - w /etc/ passwd   #统计单词出现次数
45 /etc/ passwd
# wc -m /etc/ passwd   #统计文件的字节数
1719
10、grep

二、实例

1、统计apache日志文件里访问量前十的ip并按从多到少排列:
解法1: 
         cat access_log|awk ’{print $1}’|sort|uniq -c| sort -n -r |head -10 
解法2:
cat access_log|awk-F“--” ‘{print $1}’|sort-t. | uniq -c | sort -n -r | head -10
awk ‘{a[$1] += 1;} END {for(iina) printf(“%d %s\n”,a[i], i);}’ 日志文件 |sort-n | tail
首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
当前WEB服务器中联接次数最多的ip地址
netstat -ntu |awk ‘{print$5}’|sort|uniq -c| sort -nr`
2、查看日志中访问次数最多的前10个IP
cat access_log|cut-d‘ ‘ -f 1 |sort|uniq-c|sort-nr| awk ‘{print $0}’|head-n10 |less
3、查看日志中出现100次以上的IP
cat access_log |cut -d ‘ ‘ -f1|sort|uniq -c |awk ‘{if($1>100)print$0}’|sort-nr |less
4、查看最近访问量最高的文件
cat access_log |tail -10000|awk ‘{print$7}’|sort|uniq -c|sort-nr|less
5、查看日志中访问超过100次的页面
cat access_log | cut-d‘ ‘ -f 7 | sort |uniq -c|awk ‘{if($1>100) print$0}’|less
6、统计某url,一天的访问次数
cat access_log|grep’12/Aug/2009′|grep‘/images/index/e1.gif’|wc|awk ‘{print$1}’
7、前五天的访问次数最多的网页
cat access_log|awk ‘{print$7}’|uniq -c|sort-n -r|head -20
8、从日志里查看该ip在干嘛
cat access_log |grep218.66.36.119| awk ‘{print$1″\t”$7}’|sort| uniq -c| sort -nr| less
9、列出传输时间超过 30 秒的文件
cat access_log|awk ‘($NF>30){print$7}’|sort-n|uniq -c|sort-nr|head -20
10、列出最最耗时的页面(超过60秒的)
cat access_log|awk ‘($NF>60&&$7~/\.php/){print$7}



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值