2018-06-14 bash脚本定时同步alta转化到api系统的总结

  1. bash脚本里直接使用函数或者alias的好处:灵活。

当你觉得需要修改时,直接修改函数和alias,脚本不需要重启!(实践证明这是无效的。原因是脚本执行后读取的alias可能保存了缓存,看到它重启postback脚本时日志还是覆盖的,不是追加。所以修改了alias,但是anyauto脚本调用的还是之前的alias定义。)
所以杀掉anyauto和postback进程,重启anyauto进程即可。

比如检测alta postback到api系统的脚本,检测不存在运行的脚本时,执行 altatoapi 这个alias。
后面发现这个alias没有持续保存日志,而是会重启则覆盖.于是修改alias使用 >> 重定向日志即可。

  1. 那为什么不直接写alias或者函数,而要写一个脚本并执行脚本呢?
    因为脚本里有while true等好多过程? 当然,写脚本来实现某一业务肯定比写alias听起来靠谱!
    只是脚本里如果有一些变化的东西,或者可以写成alias的,方便shell下使用的,那么借用 #!/bin/bash --login 外加 shopt -s expand_aliases 可以让脚本支持调用alias。

  2. 小总结 :

!/bin/bash --login

shopt -s expand_aliases
上面搭配使用,可以在脚本里用alias了。
logdayold={folder} 比 pushd {folder} 好,因为pushd导致控制台输出已被保存到栈的所有目录,最后越来越多,日志显示被打乱 linenums=(wc -l 1}')
记住, wc -l file 显示两列,第一列时行数,第二列是文件名。
只有 cat file|wc -l 才只显示一列,即文件名。
调试时因为忽略这个,花了很久才发现这个问题
[ "logday" ] && readlastdayfile
[ "logday" ] && linenumsold=1
判断是否跨天了,跨天就调用特殊函数并重置函数计数器.
sed 的行号是从1开始的,不是0。所以此处重置的话要用1。
第一次写用了0,结果报错调试了半天!
sed -n " p" {filename} p命令一定需要-n选项,否则没有输出。 此处使用双引号是为了使用脚本里的变量,在上引号里,需要被转义: $。不转义会导致报:",后有不识别的字符"。$ 此处表示直到文件最后一行。
使用双引号且使用s命令的话,里面的域分隔符不要用/了,换别的吧。
使用单引号会导致无法使用脚本中的变量——要用的话,写法很麻烦,所以选择双引号吧!
此处调试花了较多时间。
gawk '{ match(0,/current_url":"([^"]?)"/,a);print a[1]}'
gawk '{ match(0,/msg":"([^"]
?)has_finished_step":"([^"]?)"/,a);print a[0],a[1],a[2]}'
最后一个a[0]表示所有分组内容,a[1],a[2]则分别是第一个和第二个分组!这个是很棒的发现!可以一个match搞定——但是表示字符串顺序相关了。
如果要顺序无关的字符串提取,可以使用多个match匹配多个特征分组即可——可以用来提取alta 日志里的clickid和payout,如果需要的话。
([^|]*?)|/ 可以看到使用|来转义|了(因为值是使用|分割的字符串),否则会报错的哦。
egrep --color "\w+r\w+r\w+"
此处color达到了在控制台高亮匹配部分的效果。平时shell下可用这个。
\w+ 是 egrep支持的正则形式,写起来较好懂。
此处匹配了api系统的clickid的正则特征。
[ "(echo "{apiurl}{apiurl}{api_clickids}
最开始过滤出的clickid保存到文件了,现在读取该文件,并同步到api系统。
echo 帮助去掉首尾空格。
curl -s 即 silent,不显示进度了,输出日志就好看了。 -k是为了应对url中有https。
最后,设置对比计数器 ,logdayold=(({linenums}+1)) 如果不加1,那么可能会一会显示最后一行——如果最后一行符合api系统clickid规则德华。加1后确保了刚好从上一次读的最后一行的下一行开始读。 这样就可以不需要redis,通过sed输出指定行数之间的内容达到不重复发送转化的目的了! lastday=(date -d "1 day ago" -I|tr -d "-")

  1. 源代码:

!/bin/bash --login

shopt -s expand_aliases
apiurl="http://event.online.mobcastlead.com/e?clickid="
folder="/export/webapps/php.com/logs/debug"
api_clickids="/root/api_clickids.txt"
lastdayapi_clickids="/root/lastdayapi_clickids.txt"
logdayold={folder}
logday={folder}/slow_logic_postback(wc -l 1}')
[ "logday" ] && readlastdayfile
[ "logday" ] && linenumsold=1
echo "{linenumsold},{linenumsold},$ p" 0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" > ?" ] && while read urlstr
do
urlstr2=urlstr")
echo curl -k "urlstr2"
\curl -s -k "urlstr2"
echo
done < {logday}
linenumsold={linenums}+1))
sleep 120
done

function readlastdayfile(){
lastday={folder}/slow_logic_postback(wc -l 1}')
echo "{linenumsold},{linenumsold},$ p" 0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" > ?" ] && while read urlstr21
do
urlstr22=urlstr21")
echo curl -k "urlstr22"
\curl -s -k "urlstr22"
echo
done < ${lastdayapi_clickids}
}

你可能感兴趣的:(2018-06-14 bash脚本定时同步alta转化到api系统的总结)