日志处理中一些shell命令技巧

阴差阳错的做的日志分析,前途未卜的这段日子,唯一还有点意思的可能就是手动的处理大量日志。总结一下。

日志文件的输入是动则几个G的文本。从N个这样的文件中得到一个列表,一个数字,一个比例。在什么工具都没有情况下,用shell命令不仅是验证系统数据的准确性的方法,也是一个很好的学习过程。

使用cut命令切割日志行

下面的一行典型的apache访问日志:

120.51.133.125 - - [26/Apr/2013:12:20:06 +0800] "GET /skins/skin_homepage.php?display=wvga&lang=ja_JP&pixel=720X1280&density=2.0&version=5.7&key=5146f54950f09f71750005ef&uid=1 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 ' ' ',' 

zzx@zzx103:~/dhcptest$ echo "aaacccddd ss " | tr -s [a-c]   # -s
acddd ss

zzx@zzx103:~/dhcptest$ echo "aaacccddd  ss " | tr -s " " ","  #d和s之间有2个空格,替换后压缩重复
aaacccddd,ss,

zzx@zzx103:~/dhcptest$ echo "aaacccddd  ss " | tr -t " " ","
aaacccddd,,ss,

zzx@zzx103:~/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是一门很大的学问。这里取我碰到的一个日志,日志格式形如:

display=wvga|||lang=ja_JP|||isActive=1|||pixel=720X1280|||density=2.0|||version=5.7|||key=5146f54950f09f71750005ef|||out=abc'3|||uid=1 

如果我需要得到isActive=1的日志行,取到out=中'前一段,如上面的abc。

cat l | grep "isActive=1|" | awk 'match($0,/out=[^\x27]+/){print substr($0,RSTART+4,RLENGTH-4)}' 

grep的功能是筛选isActive=1的行。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

日志处理中一些shell命令技巧相关推荐

  1. SQL格式日志转为syslog格式:触发器中执行Shell命令

    很多企业网中都部署了日志中心,集中收集.分析和处理各种设备产生的日志. 但一些应用系统的日志是保存在数据库表中,如果需要提供syslog格式日志,除了进行代码改造外,一种快速的解决方法是使用SQL触发 ...

  2. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如 :!ls - ...

  3. python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?

    原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...

  4. python调用shell命令-python中执行shell命令的几个方法小结

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...

  5. Awk中调用shell命令

    Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...

  6. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

  7. 学习转载:Android中常用shell命令详解

    https://blog.csdn.net/Z_HUALIN/article/details/77878609 设置adb环境变量 其实就是将adb.exe的路径放到Path中,目的是cmd直接可以使 ...

  8. Linux中常见shell命令总结

    1.具体的shell命令用法可以通过help或man命令进入手册来查询其具体的用法. 2.终端本质上对应着linux上的/dev/tty设备,linux的多用户登录就是通过不同的/dev/tty设备完 ...

  9. linux Makefile 中使用 shell命令

    在makefile中要使用shell 命令必须加shell 例如 $(shell pwd) ,不加的话是空值,例如下例中的M就是空值 这个你写法如下:直接通过make 命令就可以运行下面的makefi ...

最新文章

  1. linux下使用split 来分割大文件
  2. word2013标题编号变成黑框
  3. 余秋雨的话(与OI无关)
  4. Retrofit网络请求参数注解,@Path、@Query、@Post、Body等总结(超级实用)以及以Json格式和form-data格式提交数据
  5. jumpserver 使用教程_Jumpserver之快速入门
  6. matlab rgb2ntsc函数,matlab 颜色模型之间的转换
  7. JavaScript面向对象:类、方法、属性
  8. excel字符串和单元格拼接_Excel工作表中带单位求和的4个技巧,不掌握就真的Out了!...
  9. 微信小程序PDF下载方案
  10. 移动硬盘无法打开,提示需格式化
  11. 2014年FME校园培训考核通过名单
  12. OpenMV自学笔记
  13. 初中数学题目(勾股定理)
  14. 考试自动显示答案的软件或者源码
  15. JS 文件压缩与反压缩
  16. ruoyi笔记0-尝试启动ruoyi
  17. 拉格朗日中值定理的应用
  18. Java项目:SSH电子相册管理系统
  19. 基于微信小程序的图书馆管理系统设计与实现
  20. 中国安全市场进入战国时代(转)

热门文章

  1. ZDOzMRVAOq
  2. 发现一个小坑的地方,unity的协程,想要停止,必须以字符串启动
  3. 转:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确 .
  4. ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
  5. JVM的监控工具之jstack
  6. bcp文件, 逗号文件
  7. python_sting字符串的方法及注释
  8. 如何理解 Linux 中的 load averages
  9. 002 模板实参推断、重载与模板
  10. vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist