先来一段小日志,这只是一部分日志。
#!/bin/bash
#sip=`cat * | awk '{print $2}' | awk -F "'" '{print $2}' | sort | uniq | wc -l`
#host=`cat * | awk -F '----' '{print $2}' | awk '{print $2}' | sort | uniq | wc -l`
#uri=`cat * | awk '{print $4}' | awk -F "'" '{print $2}' | sort | uniq | wc -l`
#echo "sip: $sip"
#echo "host: $host"
#echo "uri:$uri"
dir=/data/log/userdata/data/app
cd $dir
cat * > count_app.log
'sip': '100.114.190.205'----'host': daikuan.2345.com----'uri': '/image?phone=18574419525'
00.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/js/common.js'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/js/cookie.js'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/js/jquery.smartmarquee.js'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/banner.png'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/fu1.png'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/fu4.png'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/touzi.png'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/yuan2.png'
'sip': '100.104.2.23'----'host': 91jinjindai.com----'uri': '/m2/images/oct/yuan1.png'
1、删除与日志不相关的内容
观察发现,日志都是以 ‘sip’ 开头
先删除包含#的行:sed -i ‘/#/d’ test.log
为了验证修改后的效果,我们可以先看下一共有多少行:
删除包含#的行后,看看还剩多少行:
可以看出少了100多行
删除其他的行:
sed ‘/sip/!d’ test.log
其实一开始便可以使用这个命令来删除其他不是日志的行
2、只留下ip,host,uri三列,其余均不要
先去掉引号,删除引号我们可以理解为将文件中的所有的引号替换为空
单引号均替换成空了,这里需要注意:之前是用单引号将全部替换命令
去掉冒号:
可以看到,所有的冒号均已删除
删除-
删除sip,host,uri
这里使用-e,可以使用多个规则,发现sip,host,uri等替换成了—-,再次删除即可
删除完成后的日志效果为:
如何觉着之间有空格的话,可以删除空格:
sed ‘s/[[:space:]]//g’ test.log
3、对日志内容做统计
统计日子的话可以用到grep sort uniq awk等命令
4、在指定内容下添加某一行
日志文件:
spring:
jpa:
show-sql: true
data:
mongodb:
uri: mongodb://tianchi:123456@mongodb.backend.com:27017/tianchi_sys
custom:
connections-per-host: 300
socket-timeout: 0
max-wait-time: 25000
connect-timeout: 10000
threads-allowed-to-block-for-connection-multiplier: 10
redis:
host: redis.backend.com
port: 19736
cloud.inetutils.ignored-interfaces: lo.*
在port: 19736下添加一行字段,设置redis密码:
sed "/port: 19736/a\ password: 111111111" test.yml
在指定内容上插入一行字段,则使用
sed "/port: 19736/i\ password: 111111111" test.yml
在每一行的行首添加字符
# sed 's/^/HEAD&/g' 1.txt
HEADaaaaa
HEADbbbbb
HEADccccc
在每一行的行尾添加字符
# sed 's/$/&TAIL/g' 1.txt
aaaaaTAIL
bbbbbTAIL
cccccTAIL
在匹配内容的行首加字符
# sed 's/^a/HEAD&/g' 1.txt
HEADaaaaa
bbbbb
ccccc
# sed -i 's/.*swap.*/#&/' /etc/fstab
cat /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
sort可以对文件进行排序,如果不加参数,则默认按照升序输出
sort -u,可以直接去除重复的行:
这里便是按照字母的排序
可以看到重复的行已经去掉
sort -r 降序排序
有时候我们使用sort进行排序的时候,需要重定向到一个新的文件,如果重定向源文件会出现被清空的现象,这个时候使用 -o 选项可以解决
看到原文件被清空,使用 -o试试
sort -n 以数值排序,例如有时候10比2小的情况
接下来的选项会是非常有用和常见的:
-t -k
如果不指定,默认是排序第一列
使用-k指定特定的列,这里默认是认为列与列之间默认的分隔符是空格
使用-t指定分隔符,比如说列与列之间有冒号,有空格这时候-t就发挥作用了
uniq:
uniq只需要掌握常见的几个参数就可以了
-c 在输出行前面加上每行出现的重复次数
-d 仅显示重复行
-u 仅显示不重复的行