shell命令:抽取日志中最后一列内容并转为批量sql

数据库表中有一url字段保存的是抓取url, 其中有些是无效的,当访问时会有如下的异常日志输出:

15-01-10 01:33:34,805 WARN com.test.recipevideohunter.VerifyDownloadUrl(VerifyDownloadUrl.java:45) ## 9 404 http://main.gslb.ku6.com/s1/t6F2Hw
OQFjnGhlk4/1228739498805/6a642a1a078c70105faecbfe279e0d60/1417507387239/v497/31/38/OvpyEGwZCS6OQw1FDCDpkEPw.mp4?rate=400 
15-01-10 01:33:49,823 WARN com.test.recipevideohunter.VerifyDownloadUrl(VerifyDownloadUrl.java:45) ## 16 404 http://main.gslb.ku6.com/s1/e1jhQ
lepjX5yM_Bw/1230877361121/4360b98ad5564c3a74609befa9391bcc/1417507393603/v477/10/31/r20PxPOUIQSiazUWgCCHPXIg.mp4?rate=180

想抽取出当前所有日志中的异常url。

日志均是以recipevideohunter开头且url为输出中最后一列。

  1. 打印最后一列url

awk '{print $NF}'  recipevideohunter*


2. 去重(因存在重复url)

awk '{print $NF}'  recipevideohunter* | sort | uniq

3. 重定向到一个文件中

awk '{print $NF}'  recipevideohunter*  | sort | uniq > invalid_url.txt

现在invalid_url.txt文件中的内容为(纯url了): 

http://main.gslb.ku6.com/o1/EPi7Gx2qL8gUbsPN/1218865000378/3e3ac380ad70221150d12803822be81b/1417507369022/v379/2/8/gH4x5sXGSuSfpUvmBBMj4Mg.mp4?
rate=250
http://main.gslb.ku6.com/s0/0qDR7_G3q03PATmc/1247598214983/73dc3715d688068e9d1167e97884b3eb/1417508605892/v591/25/6/gIMFWf23QKmUITSRqHWBkWQ.mp4
?rate=180
http://main.gslb.ku6.com/s0/0S_FT_u-PZao6wnP/1219971248203/56584bf6c1bc4e5a58c36ea85e9f578a/1417507639811/v340/11/14/9yJPs713S7CD9DgbZgK5aw.mp4
?rate=100

想将这些无效url从数据库中删除,如何得到批量删除sql呢?

vi  invalid_url.txt
:1,$s/^\(.*\)$/delete from tb_video where url='\1';/g

文本会转为:

delete from tb_video where url='http://main.gslb.ku6.com/s3/Q5LrC3SLgLhkgKEw/1229071108665/0abcb9d3ff15cfef9d5bd4b84ae3371c/1417507400981/v498/22/13/N3NAqsrMR12RF4EG0YcJpgB.mp4?rate=200';
delete from tb_video where url='http://main.gslb.ku6.com/s3/UN8gxoBmHkfj_GNS/1234122701846/ff2b38c04ebadbf7e7153c42e3e3b7d9/1417507397293/v532/19/23/VUVHC1lcMRY62NP77rU0UIqw.mp4?rate=100';
delete from tb_video where url='http://main.gslb.ku6.com/s4/0yqP8eDf_UmxuQUs/1234121433821/375d86953ff0c24e44ebb8c69b1465c4/1417508132623/v540/11/32/jUNwAJTSSQFuZxapvACilkOw.mp4?rate=100';

接着 :wq即可

注: 1,$ 表示从第一行到最后一行

 s/^\(.*\)$/delete from tb_video where url='\1';/

 s表示替换 s/old/new/

 ^\(.*\)$ 匹配整个url

 \1代表前面的整个url,也即括号里的内容

 /g 表示全部替换

若用java来实现同样功能的话,代码如下:

String url = "http://www.baidu.com/";
String sql = url.replaceFirst("(.*)", "delete from tb where url = '$1';"); //$1表示前面正则表达式里括号里的内容
System.out.println(sql); //delete from tb where url = 'http://www.baidu.com/';


你可能感兴趣的:(shell)