沙田镇仿做网站,网站加速器quickq,班级建设怎样建立班级网站,wordpress博客主机选择日志处理中一些shell命令技巧 阴差阳错的做的日志分析#xff0c;前途未卜的这段日子#xff0c;唯一还有点意思的可能就是手动的处理大量日志。总结一下。 日志文件的输入是动则几个G的文本。从N个这样的文件中得到一个列表#xff0c;一个数字#xff0c;一个比例。在什么…日志处理中一些shell命令技巧 阴差阳错的做的日志分析前途未卜的这段日子唯一还有点意思的可能就是手动的处理大量日志。总结一下。 日志文件的输入是动则几个G的文本。从N个这样的文件中得到一个列表一个数字一个比例。在什么工具都没有情况下用shell命令不仅是验证系统数据的准确性的方法也是一个很好的学习过程。 使用cut命令切割日志行 下面的一行典型的apache访问日志 120.51.133.125 - - [26/Apr/2013:12:20:06 0800] GET /skins/skin_homepage.php?displaywvgalangja_JPpixel720X1280density2.0version5.7key5146f54950f09f71750005efuid1 HTTP/1.1 200 4847 http://t.co/rww3WDuhS5 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; YTB730) 0 如果需要得到IP地址可以使用cut命令 cat log | cut -d -f1 -d 表示按照空格将行切开-f1 取第一个字段这样得到的结果就是IP列表 有时候拿到的文件是\t分隔也可以使用cut切开只不过需要多写一个$ [l]$ cat log | cut -d \t -f1 cut: the delimiter must be a single character #-d \t会报错的 cut -f2 -d$\t infile #work 使用tr命令去掉字符替换字符 -c:complement用SET2替换SET1中没有包含的字符-d:delete删除SET1中所有的字符不转换-s: squeeze-repeats压缩SET1中重复的字符-t: truncate-set1将SET1用SET2转换一般缺省为-t 如果拿到分割的文件 cat log | tr -s , zzxzzx103:~/dhcptest$ echo aaacccddd ss | tr -s [a-c] # -sacddd ss zzxzzx103:~/dhcptest$ echo aaacccddd ss | tr -s , #d和s之间有2个空格替换后压缩重复aaacccddd,ss, zzxzzx103:~/dhcptest$ echo aaacccddd ss | tr -t , aaacccddd,,ss, zzxzzx103:~/dhcptest$ echo aaacccddd ss | tr -s a b #替换后压缩重复bcccddd ss 将空格替换成,文件变成csv cat log | tr -d 上面的命令直接删除空格 日志处理后经常会出现空行tr命令去掉空行的原理就是将连续两个换行替换成一个换行 cat log | tr -s \n\n \n 使用uniq命令去重 试想得到IP列表欲得到独立访问的IP列表。 [l]$ cat log | cut -d -f1 | uniq -u 如果不仅仅是去重还想统计每个IP访问次数可以加一个参数c [l]$ cat log | cut -d -f1 | uniq -uc 得到的格式形如 1 126.193.38.128 5 49.98.156.154 前面的数字就是出现的次数 使用awk/seed来处理日志 awk/seed是处理日志的最终的万金油。确实是什么都可以做。awk/seed是一门很大的学问。这里取我碰到的一个日志日志格式形如 displaywvga|||langja_JP|||isActive1|||pixel720X1280|||density2.0|||version5.7|||key5146f54950f09f71750005ef|||outabc3|||uid1 如果我需要得到isActive1的日志行取到out中前一段如上面的abc。 cat l | grep isActive1| | awk match($0,/out[^\x27]/){print substr($0,RSTART4,RLENGTH-4)} grep的功能是筛选isActive1的行。awk 后面跟的是awk语言。$0总是代表当前匹配的字段值match substr是awk可以用的函数当match时后面{}中的代码才会执行。当match$0就是正则匹配的部分。RSTART,RLENGTH是awk可以使用的常量分别表示开始匹配的开始下标RLENGTH是匹配的长度。 在中需要再使用光转义是不行的得用16进制的代码\x27。转16进制可以使用python代码 .encode(hex)得到 //惊讶awk就这么简单的解释了可这连入门都算不上。 集合操作 试想我想得到两个列表的交际并集差集统计中经常会碰到比如我想获得昨天今天都在访问的IP其实就是今天的IP列表和昨天IP列表的交集。 先定义两个简单的文件 [ l]$ cat a.txt 1 2 3 4 5 [ l]$ cat b.txt 4 5 6 7 8 9 如果想得到ab的交集4 5 ,可以使用下面的命令 sort -m a.txt b.txt | uniq -d 4 5 如果要得到并集1-9可以 sort -m a.txt b.txt | uniq 1 2 3 4 5 6 7 8 9 如果想得到ab的差集即a去掉ab的交集1 2 3 comm -23 a.txt b.txt 1 2 3 同理ba的差集 comm -13 a.txt b.txt comm -23 b.txt a.txt 上述两个命令等价 comm命令就是compare功能如果什么参数都不带呢得到的什么呢 comm a.txt b.txt 1 2 3 4 5 6 7 8 9 diff命令以前经常看代码改了哪些 diff a.txt b.txt 1,3d0 1 2 3 5a3,6 6 7 8 9 总结参考资料 窃以为能玩转上面这些命令处理个日志问题不大了。 一篇介绍shell中集合操作的博文 http://wordaligned.org/articles/shell-script-sets 一直放在收藏夹的shell方面的博客 Linux Shell常用技巧 Linux Shell高级技巧 awk部分写的独好转载于:https://www.cnblogs.com/hanxing/p/4113554.html