将pattern1和pattern2之间的行放到一个单独的文件中,包括shell中带有pattern1的行

时间:2015-10-22 19:51:48

标签: linux shell awk sed

我有一个包含数千行的文本文件,如下所示

TextField

现在,我希望获得包含匹配模式OBJECT1的块。

`DEFINE OBJECT('OBJECT.TOPIC') +
*  ALTDATE(2015-09-22) +
*  ALTTIME(00.56.38) +
   DESCR('topic object') +
   GET(ENABLED) +
   PUT(ENABLED) +
   PROPCTL(COMPAT) +
   TARGTYPE(TOPIC) +
   REPLACE
DEFINE OBJECT('OBJECT1') +
*  CRDATE(2015-09-22) +
*  CRTIME(00.56.38) +
*  CURDEPTH(0) +
   CUSTOM(' ') +
   DESCR('TEST') +
   DISTL(NO) +
   PROCESS(' ') +
   SHARE +
   USAGE(NORMAL) +
   REPLACE
DEFINE OBJECT('OBJECT2') +
*  ALTDATE(2015-09-22) +
*  ALTTIME(00.56.38) +
*  CURDEPTH(0) +
   CUSTOM(' ') +
   DESCR('TEST') +
   DISTL(NO) +
   PROCESS(' ') +
   SHARE +
   USAGE(NORMAL) +
   REPLACE
DEFINE OBJECT('TCOBJECT1') +
*  CRDATE(2015-09-22) +
*  CRTIME(00.56.38) +
*  CURDEPTH(0) +
   CUSTOM(' ') +
   DESCR('TEST') +
   DISTL(NO) +
   PROCESS(' ') +
   SHARE +
   USAGE(NORMAL) +
   REPLACE
SET RECORD +
   PROFILE('OBJECT2') +
   GROUP('user1') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('TCOBJECT1') +
   GROUP('user3') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user1') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user2') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user3') +
   AUTHADD(change,delete,display,alter)`

我试过用awk和sed来获得至少第一部分。但它在pattern2的第一场比赛后没有停止。我正在运行这些命令只是为了得到第一个块至少..

`DEFINE OBJECT('OBJECT1') +
*  CRDATE(2015-09-22) +
*  CRTIME(00.56.38) +
*  CURDEPTH(0) +
   CUSTOM(' ') +
   DESCR('TEST') +
   DISTL(NO) +
   PROCESS(' ') +
   SHARE +
   USAGE(NORMAL) +
   REPLACE
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user1') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user2') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user3') +
   AUTHADD(change,delete,display,alter)`

但这些都不行。请帮助

根据建议的答案,我使用 awk -vRS =" [^ +] \ n" ' BEGIN {printf"`"} / \ / {printf $ 0 RT}' 并获得所需的输出。但是现在我想从使用上面命令获得的输出中删除包含user2和user3的块。

4 个答案:

答案 0 :(得分:1)

awk -vRS="[^+]\n" 'BEGIN{printf "`"}/\<OBJECT1\>/{printf $0 RT}' a

答案 1 :(得分:0)

要求救援! (在sed的帮助下)

$ sed -r 's/^([^* ])/\n\1/' file | awk -v RS= '/OBJECT1/'

将打印

DEFINE OBJECT('OBJECT1') +
*  CRDATE(2015-09-22) +
*  CRTIME(00.56.38) +
*  CURDEPTH(0) +
   CUSTOM(' ') +
   DESCR('TEST') +
   DISTL(NO) +
   PROCESS(' ') +
   SHARE +
   USAGE(NORMAL) +
   REPLACE
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user1') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user2') +
   AUTHADD(change,delete,display,alter)
SET RECORD +
   PROFILE('OBJECT1') +
   GROUP('user3') +
   AUTHADD(change,delete,display,alter)`

PS。请注意,不会打印起始引号,因为它不在提取的行上。

对于更有针对性的匹配,您可以将引用组合为模式的一部分。但是,在awk中它具有特殊含义,应予以对待。我使用以下方法。

$ ... | awk -v RS= -vq="'" '$0 ~ q"OBJECT1"q'

答案 2 :(得分:0)

awk 'BEGIN{RS="DEFINE OBJECT"}{if($1~/\('\''OBJECT1'\''\)/){print$0}}' my_file

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '/^\w/!{H;$!d};x;/\bOBJECT1\b/p;x;h;d' file

如果不是记录的开头,则将其附加到保留空间(HS),如果不是最后一行则将其删除。否则,它是记录的开头或最后一行,在这种情况下:检查HS是否需要字符串,如果找到则打印,然后用记录的开头替换HS。