WilliamLin 2012-01-28
linux sed 命令 是linux shell脚本中比较重要的命令,下面就根据一个小小的需求来琢步分解一条较复杂的sed命令。
首先创建一个测试文档,命名为 test.log
1 2 3 4 5 | 1 li.maoyuan cost=123ms 2 mao.yuan cost=234ms 3 maoyuan.li cost=345ms 4 li.mao.yuan cost=456ms 5 mao.yuan.li cost=567ms |
需求是将这个日志中包含 “li” 的记录,中间名称部分和后面的消费时间,拼成一句sql ,并存入数据库。
期望的结果是
1 2 3 4 | insert into values ( "li.maoyuan" , "123" ) insert into values ( "maoyuan.li" , "345" ) insert into values ( "li.mao.yuan" , "456" ) insert into values ( "mao.yuan.li" , "567" ) |
下面来一步步的分解。
首先利用grep命令来过滤 “li”
1 2 3 4 5 | [root@web68 sed]# grep 'li' test.log 1 li.maoyuan cost=123ms 3 maoyuan.li cost=345ms 4 li.mao.yuan cost=456ms 5 mao.yuan.li cost=567ms |
然后来删掉记录前面的数字
1 2 3 4 5 | [root@web68 sed]# grep 'li' test.log | sed 's/. //' li.maoyuan cost=123ms maoyuan.li cost=345ms li.mao.yuan cost=456ms mao.yuan.li cost=567ms |
解释:sed ‘s/. //’ linux sed 命令中的s标识,利用正则表达式来进行替换 ,正式表达式 /. / 是点加一个空格,意思是任意字符加一个空格。
然后同样利用linux sed 命令中的s来删掉”cost=”和”ms”
1 2 3 4 5 | [root@web68 sed]# grep 'li' test.log | sed 's/. //' | sed 's/cost=//' | sed 's/ms//' li.maoyuan 123 maoyuan.li 345 li.mao.yuan 456 mao.yuan.li 567 |
最后利用linux gawk命令把结果拼出SQL,并输出到result.log文件中
1 2 3 4 5 | [root@web68 sed]# grep 'li' test.log | sed 's/. //' | sed 's/cost=//' | sed 's/ms//' | gawk '{print "insert into values (\""$1"\",\""$2"\");"}' ; > resutl.log insert into values ( "li.maoyuan" , "123" ); insert into values ( "maoyuan.li" , "345" ); insert into values ( "li.mao.yuan" , "456" ); insert into values ( "mao.yuan.li" , "567" ); |
这样就大功造成了,一句看似很复杂的命令集,其实都是若干个最基本点组成的。
linux sed的基本命令可以去这里了解 http://ericyuen.blogbus.com/logs/4819803.html