Reputation: 215
I had asked this question earlier. Get lines between pattern1 and pattern2 into a seperate file including the line with pattern1 in shell
And am using awk to get what i want as suggested by @A-Ray. However, earlier i used to run a command against each object(about 500 of them) and then use awk to get what i wanted. Now, instead of doing that, i am trying to spit everything into a text file and use awk to get lines for individual objects.
So, my text file is
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
DEFINE OBJECT('OBJECT1TC') +
* CRDATE(2015-09-22) +
* CRTIME(00.56.38) +
* CURDEPTH(0) +
CUSTOM(' ') +
DESCR('TEST') +
DISTL(NO) +
PROCESS(' ') +
SHARE +
USAGE(NORMAL) +
REPLACE
DEFINE OBJECT('OBJECT1.TC') +
* 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)
SET RECORD +
PROFILE('OBJECT2') +
GROUP('user3') +
AUTHADD(change,delete,display,alter)
SET RECORD +
PROFILE('OBJECT1.TC') +
GROUP('user1') +
AUTHADD(change,delete,display,alter)
SET RECORD +
PROFILE('OBJECT1.TC') +
GROUP('user2') +
AUTHADD(change,delete,display,alter)
And I want the output as
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)
So if you look at the output i want, i am getting blocks only for OBJECT1 and removing anything with OBJECT1 and user3.
So the command i am using for this is
cat testawk.txt|awk -vRS="[^+]\n" 'BEGIN{printf ""}/\<OBJECT\>/&&!/\<'user3'\>/{printf $0 RT}'
But by using the above command i get the output as
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('OBJECT1.TC') +
* 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.TC') +
GROUP('user1') +
AUTHADD(change,delete,display,alter)
SET RECORD +
PROFILE('OBJECT1.TC') +
GROUP('user2') +
AUTHADD(change,delete,display,alter)
Is there a way to get an exact match for OBJECT1?
Upvotes: 0
Views: 135
Reputation: 67467
awk
to the rescue!
handling quotes is hard, better to externalize them from the script. Using quotes eliminate the need to set the word boundaries as well (quotes are the boundaries).
$ awk -vRS='[^+]\n' -vk="'OBJECT1'" -vu="'user3'" '$0~k && $0!~u{printf "%s",$0 RT}' file
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)
Upvotes: 1