sed & 记一次线上log遇到的问题

sed & 记一次线上log遇到的问题

六月 21, 2018
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
先总结一个工作中遇到的实例:
有一个log文件因为json格式错误,自动导入kibana失败后手动执行fluent-cat报错

[root@ip log]# cat logics_auth.06.12.2018.log |/opt/td-agent/embedded/bin/fluent-cat auth
parse error: unallowed token at this point in JSON text
:"[Debug]"}
(right here) ------^
[root@ip log]# cat logics_auth.07.12.2018.log |/opt/td-agent/embedded/bin/fluent-cat auth
parse error: unallowed token at this point in JSON text
,"DeviceId":"imeiA00000731A2953
(right here) ------^

[root@ip log]# cat logics_auth.06.12.2018.log | grep ^: (通过grep ^: 找到以:开头的报错信息)
:"[Debug]"}
[root@ip log]# cat logics_auth.06.12.2018.log | grep ^: -n (-n 确定报错的行数)
1153064::"[Debug]"}

[root@ip log]# sed -i '1153064d' logics_auth.06.12.2018.log (删除确定行的错误信息)
[root@ip log]# cat logics_auth.06.12.2018.log |/opt/td-agent/embedded/bin/fluent-cat auth (执行fluent-cat

sed基本用法:

1
2
3
4
5
\(..\)匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。

替换文本中的字符串:

sed 's/book/books/' file
1
2
3
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:

sed -i's/book/books/g’ file
1
2
3
使用后缀 /g 标记会替换每一行中的所有匹配:

sed 's/book/books/g’ file
1
2
3
4
5
6
7
8
9
10
11
12
13
当需要从第N处匹配开始替换时,可以使用 /Ng:

echo sksksksksksk | sed 's/sk/SK/2g'

skSKSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/3g'

skskSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/4g'

skskskSKSKSK
1
2
3
定界符出现在样式内部时,需要进行转义:

sed 's/\/bin/\/usr\/local\/bin/g
1
2
3
删除空白行:

sed '/^$/d’ file
1
2
3
删除文件的第2行:

sed '2d’ file
1
2
3
删除文件的第2行到末尾所有行:

sed '2,$d’ file
1
2
3
删除文件最后一行:

sed '$dfile
1
2
3
删除文件中所有开头是test的行:

sed '/^test/'dfile
1
2
3
love被标记为1,所有loveable会被替换成lovers,并打印出来:

sed -n 's/\(love\)able/\1rs/p’ file
1
2
3
打印从第5行开始到第一个包含以test开始的行之间的所有行:

sed -n '5,/^test/p’ file
1
2
3
将 this is a test line 追加到 以test 开头的行后面:

sed '/^test/a\this is a test linefile
1
2
3
将 this is a test line 追加到以test开头的行前面:

sed '/^test/i\this is a test linefile
1
2
3
test.conf 文件第2行之后插入 this is a test line

sed -i '2a\this is a test linetest.conf
1
2
3
4
5
6
7
8
9
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:

sed -e '/test/h' -e '/check/x’ file

-e选项允许在同一行里执行多条命令:

sed-e'1,5d'-e's/test/check/‘ file

上面sed表达式的第一条命令删除15行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。