shell 脚本可以说作用非常大,在服务器领域,用 shell 操作事务可比手动点击要方便快捷得多了。虽然只是文字界面,但是其强大的处理功能,会让各种操作超乎想象。而且,也可以将这些习惯移植到日常的工作当中,提升办事效率。
其实 shell 语法很简单,基本上就是综合一下在命令行下,一个个的命令集合,然后就组成了 shell 脚本。当然了,不懂语法的,百度搜索一下就好了嘛,毕竟,重要的是思想而非语法。
最近,刚接一需求,如下:
DBA 会将一些服务规则的数据导出,然后一条条手动去 curl 某应用接口,从而完成相应的业务要求。
那么问题来了,DBA 导出的数据是格式化的,要 curl 的接口也是格式化的,需要的,只是将相应的数据替换成对应的值即可。注意,不保证所有的命令都能执行成功,有可能需要重新跑接口。
很明显,手动一条条地去写 curl 命令,然后一条条执行,然后观察结果,做出判断,这对于少数几个数据来说,是可行的。但是假设,数据有几百条、几千条几万条呢,那就不可能人工一条条去搞了吧。因此,shell 脚本就该出场了(当然了,有同学说,我用其他语言也可以啊,甚至说我这个功能写到代码里就可以了,然而这些特殊无意义的代码,是不需要长期保留下来的)。
该 shell 脚本只要做好三件事就行了:
需求很简单,不懂语法没关系,查一下嘛。参考代码如下:
- #!/bin/bash
- log_file='result.log'
- param_file=$1 # 源数据在命令行中指定
- log_cmd="tee -a $log_file"
- i=1
- for line in `cat $param_file`;
- do
- echo "read line" $i ":" $line | tee -a $log_file
- let "i=$i+1"
- OLD_IFS=$IFS;IFS=",";
- arr=($line)# 分割数据到数组
- IFS=$OLD_IFS;
- curl_cmd="curl -d 'uId=${arr[0]}&bid=${arr[1]}&bA=${arr[2]}&to=6&bP=30&fddays=5' http://localhost:8080/mi/api/ss/1.0.1/co/apply"
- echo `date "+%Y-%m-%d %H:%M:%S"` "start ===>> " $curl_cmd | tee -a $log_file
- eval "$curl_cmd 2>&1" | tee -a $log_file # 使用 eval 命令,把错误日志和接口返回结果一并带回,到后续console及日志存储
- echo `date "+%Y-%m-%d %H:%M:%S"` "end <<===" $curl_cmd | tee -a $log_file
- done
- echo `date "+%Y-%m-%d %H:%M:%S"` "over: end of shell" | tee -a $log_file
源数据格式参考如下:
- 234,201708222394083443,5000
- 4211,201782937493274932,3000
- 23,201749379583475934,2000
这里有个技巧,即 使用 tee 命令,既在 console 上显示了访问日志,也往文件里写入了记录 。即有人工观察,也有日志存储,以备查看。
如此,便实现了大家都不用手动敲数据,从而在这上面犯错的可能了。 DBA 从数据导出格式化数据,shell 脚本直接读取格式化数据,保留记录。这才是程序该干的事。
一句话,想办法偷个懒,这是我们该干的事。
但是应该要注意,当一个接口被脚本跑去执行时,你就行考虑并发问题,以服务器的压问题了,也不要太相信代码。做最坏的打算。
curl 的命令请参考: https://curl.haxx.se/docs/manpage.html (你可以搜简要中文描述,当然)
从前,我觉得 1、2G 的日志文件处理是个头疼的问题,但是后来发现 grep, awk, sed, less, salt 等工具组合起来,能让你从几十 G 甚至更多的千军万马文件中,直取要害。这便是 linux 的厉害之处。
来源: http://www.tuicool.com/articles/iaEzii