利用 sed 去除指定输出字符

最近在利用 CU 的短信接口给公司的各种服务编写各种自动短信告警脚本,在进行主机空间预警的时候,一开始出现百分数无法进行对比的情况,比如 30%>10% 会出错,利用 sed 对百分号进行去除后 sed 's/%//g' 后可以正常进行对比并执行下一步条件。

刚开始还觉得挺简单,后来利用 expect 进行远程主机磁盘空间监控的时候,进行阈值对比时出现 invalid arithmetic operator 错误,无法识别指定字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
< 0")|| 42x error: invalid arithmetic operator (error token is "line 83: ((: 42
< 0")|| 6ax error: invalid arithmetic operator (error token is "line 83: ((: 6
< 0")|| 7ax error: invalid arithmetic operator (error token is "line 83: ((: 7
< 0")|| 6ax error: invalid arithmetic operator (error token is "line 83: ((: 6
< 0")|| 16x error: invalid arithmetic operator (error token is "line 83: ((: 16
< 0")|| 10x error: invalid arithmetic operator (error token is "line 83: ((: 10
< 0")|| 19x error: invalid arithmetic operator (error token is "line 83: ((: 19
< 0")|| 9ax error: invalid arithmetic operator (error token is "line 83: ((: 9
< 0")|| 4ax error: invalid arithmetic operator (error token is "line 83: ((: 4
< 0")|| 2ax error: invalid arithmetic operator (error token is "line 83: ((: 2
< 0")|| 3ax error: invalid arithmetic operator (error token is "line 83: ((: 3
< 0")|| 3ax error: invalid arithmetic operator (error token is "line 83: ((: 3
< 0")|| 3ax error: invalid arithmetic operator (error token is "line 83: ((: 3
< 0")|| 3ax error: invalid arithmetic operator (error token is "line 83: ((: 3

顿时觉得应该是远程获取到数据后,字符格式发生了变化,导致无法进行对比,遂用bc对字符进行转换。但是执行时出现非法字符的报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(standard_in) 1: illegal character: ^M
(standard_in) 2: illegal character: ^M
(standard_in) 3: illegal character: ^M
(standard_in) 4: illegal character: ^M
(standard_in) 5: illegal character: ^M
(standard_in) 6: illegal character: ^M
(standard_in) 7: illegal character: ^M
(standard_in) 8: illegal character: ^M
(standard_in) 9: illegal character: ^M
(standard_in) 10: illegal character: ^M
(standard_in) 11: illegal character: ^M
(standard_in) 12: illegal character: ^M
(standard_in) 13: illegal character: ^M
(standard_in) 14: illegal character: ^M

问题终于出现了,原来远程取数输出的时候,自动给我加上了换行符,导致字符无法转换,也无法进行对比。在使用 sed 对换行符进行去除后,问题终于解决,可以正常进行对比并执行下一步条件。

总结数据异常的排除方法如下:

1
2
3
4
5
sed 's/%//g' #去除百分号
sed 's/\n//g' #去除换行符
sed 's/\r//g' #去除回车符
echo 123%|sed 's/%//g' #用法
sed -e 's/\[//g;s/\]//g' #替换多个字符

sed 的具体参数,就不列举了,度娘都知道。:p