2017-09-01 98 views
0

我有大的文本文件(471 615行)。它的结构是这样的:LINUX从文件中删除文本部分与sed基于

use TABLE1/*!*/ 
good code here 
use mysql/*!*/ 
bad code here 
use TABLE1/*!*/ 
good code here 
use mysql/*!*/ 
... 
... 

如何删除“错误的代码”部分? Offcourse我知道这将是正则表达式的循环,但如何使它?我已经使用bash循环来从mysql二进制日志文件中构建类似的文件,并根据它们的行号删除了一些sed内容,但是这个文件有太多的事件可以通过行号删除它们。

PS。我刚刚手动完成了1个月的时间,并且出现了23次“错误代码”。有6个月的时间可以修复,所以大概会有130-140次发生。正如你看到的,我将不得不花费整整一天铲除出来手动

+0

错误代码后,每行“使用mysql“排队第一次”使用TABLE1“ – 180doman

回答

0

我试图RomanPerekhres和拉曼Sailopal解决方案。第一次剪切得太多了(文件开头有一些标题,第二个做了很好的工作,但留下了一些问题,我没有试图分析原因,只是改变了策略,我只是删除了每一行,包含一些特定的词,如GRANT TO, FUNCTION,CREATE USER,DROP USER,特权等(与SED offcourse)。这样我切出mysql表连接的所有命令。

谢谢大家对你的帮助呢。

1

简单AWK方法:

示例文件testfile

use TABLE1/*!*/ 
select user_id 
from 
system_users 
use mysql/*!*/ 
drop database 
delete * from users 
delete id from system_users 
use TABLE1/*!*/ 
select 
    sum(price) 
from 
    orders 
use mysql/*!*/ 
update users 
    set id = "bad boy" 
drop table users 

的工作:

awk '/^use TABLE/{ f=1 }/^use mysql/{ print; f=0 }f' testfile 

输出:

use TABLE1/*!*/ 
select user_id 
from 
system_users 
use mysql/*!*/ 
use TABLE1/*!*/ 
select 
    sum(price) 
from 
    orders 
use mysql/*!*/ 
0

这可能为你工作(GNU SED):

sed '/^use/h;G;/^use mysql/M!P;d' file 

追加use语句每行,只打印不包含use mysql所附的那些行部分。

0

另一个sed的方法

sed '/use mysql\/*!*\//,/use TABLE1\/*!*\//{//!d}' filename 

搜索使用MySQL之间的一切......和使用TABLE1 ......那么除了包含搜索模式的行删除所有内容。

0

sed是s/old/new/,就是这样。你不是在做s/old/new/所以你不应该考虑使用sed。只需使用AWK:

$ awk '/^use mysql/{f=1} /^use TABLE1/{f=0} !f' file 
use TABLE1/*!*/ 
good code here 
use TABLE1/*!*/ 
good code here 

如果你喜欢打高尔夫球,你可以减少只是:

$ awk '/^use/{f=/mysql/}!f' file 
use TABLE1/*!*/ 
good code here 
use TABLE1/*!*/ 
good code here