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

标签 linux shell awk sed

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

`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)`

现在,我想获取包含匹配模式 OBJECT1 的 block 。

`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 和 sed 至少获得第一部分。但在 pattern2 的第一场比赛之后它并没有停止。我运行这些命令只是为了至少获得第一个 block ..

awk '/OBJECT1/ {p=1}; p; $0=="REPLACE" {p=0}' objlist.txt > obj1list.txt 

awk '$0=="OBJECT1" {p=1}; p; $0=="REPLACE" {p=0}' objlist.txt > obj1list.txt

cat objlist.txt | sed  -n '/OBJECT1/p;/REPLACE/q' > obj1list.txt 

但是这些不起作用。请帮助

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

最佳答案

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

关于linux - 将 pattern1 和 pattern2 之间的行放入一个单独的文件中,包括 shell 中带有 pattern1 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289518/

相关文章:

linux shell 获取文件名

perl - 什么脚本可以帮助解析一组错误换行的行?

php - 如何获取php系统函数的全部输出

linux - Laravel/VirtualBox/Mac 权限错误

linux - 如何通过 Linux ping 内部应用程序 url?

linux - 将/etc/yum.repos.d/* 复制到所有计算机上的同一目录,而无需重复输入 root 密码

android - 如何使用 adb shell 控制蓝牙操作?

bash - 当使用空参数运行 grep 时,为什么 "while read"循环会停止?

awk - 如何使用 awk 进行连接

linux - 从一个文件中提取与另一个文件中的行相对应的数据