日志处理中一些shell命令技巧
日志处理中一些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高级技巧 awk部分写的独好
日志处理中一些shell命令技巧的更多相关文章
- 让你提前认识软件开发(23):怎样在C语言中运行shell命令?
第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...
- Linux_CentOS常用命令和shell命令技巧
Linux_CentOS常用命令 关机 init 重启 init 列出当前目录的下的文件 ls //列出当前目录下的文件 ll //列出当前目录下的文件信息 等同ls -l 命令 切换目录 cd 目录 ...
- Awk中调用shell命令
Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...
- 【转载】如何在C语言中调用shell命令
转载自:http://blog.csdn.net/chdhust/article/details/7951576 如何在C语言中调用shell命令 在linux操作系统中,很多shell命令使用起来非 ...
- 在 Ruby 中执行 Shell 命令的 6 种方法
我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...
- python中执行shell命令的几个方法小结(转载)
转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...
- shell命令技巧——文本去重并保持原有顺序
简单来说,这个技巧相应的是例如以下一种场景 假设有文本例如以下 cccc aaaa bbbb dddd bbbb cccc aaaa 如今须要对它进行去重处理.这个非常easy,sort -u就能够搞 ...
- 在程序中执行shell命令
在linux系统下的操作中我们会经常用到shell命令来进行,一开始学习进程的时候对于shell命令也进行了思考,认为shell命令就是一个进程的外壳,经过了后来的学习对于这一点也有了更多的认识. 用 ...
随机推荐
- uni app中关于图片的分包加载
因为在项目中使用了大量的静态资源图片,使得主包体积过大, 而把这些图片全部放到服务器又有点麻烦,就想能不能把图片也分包,但是直接放在分包下的话导致图片资源找不到了, 在社区中看到大佬分享的十分有用,特 ...
- Ubuntu下安装 Mysql
MYSQL在ubuntu16.04下的编译安装mysql-5.6.23.tar.gz 为减少安装过程中因权限带来个各种问题,建议全程用root用户编译安装,步骤如下: 1.安装依赖文件 apt-ge ...
- 使用Ghidra分析phpStudy后门
一.工具和平台 主要工具: Kali Linux Ghidra 9.0.4 010Editor 9.0.2 样本环境: Windows7 phpStudy 20180211 二 .分析过程 先在 Wi ...
- Vue+Axios+Nigix+SpringCloud前端和后端搭建及其碰到的问题
一.Axios.Router的安装和使用 1.如何安装Axios和Router 1).进入到工程所在的文件夹,通过cmd指令,进入到window的dos界面 2).输入:npm install axi ...
- 吴裕雄--天生自然java开发常用类库学习笔记:线程的生命周期
class MyThread implements Runnable{ private boolean flag = true ; // 定义标志位 public void run(){ int i ...
- linux桌面系统 镜像下载
1.Ubuntu 官方下载地址(不推荐,网速较慢):https://www.ubuntu.com/download 阿里云:http://mirrors.aliyun.com/ubuntu-relea ...
- Good Bye 2019
A.Card Game 题目大意:两个人都有共有n张卡牌,每张卡牌上都有一个数xi,没有两张牌上的数相同,且xi不小于1不大于n.每次两个人选出一张牌来,牌上数字大的人赢得此局,如果谁最后手上拥有所有 ...
- Java扫雷游戏: JMine
JMine是用Java和Swing编写的扫雷程序.作者是Jerry Shen(火鸟),代码有一定年头了,最开始是作者的课程设计.阅读这种小程序对编程语言的学习挺有帮助.本文只简单介绍一些关键的地方,实 ...
- java中JDBC当中请给出一个DataSource的HelloWorld例子
在前面 的jdbc的Helloworld程序当中,我们用DriverManager来获取数据库连接.事实上通过这种方法获取数据库连接,是比较耗费计算机资 源的.当然了,这也是没有办法的事儿.就像我们买 ...
- 3. SSH 服务器安装
1.查看SSH是否安装(检查是否装了SSH包) 输入命令:rpm -qa | grep ssh 2.安装SSH 服务 yum install openssh-server 3.查看SSH服务是否正在运 ...