awk with exclude pattern in shell

46 views Asked by At

text file has below lines named 'log'

--- [n-event-group-3] action
--- [n-event-group-8] action.service
--- [n-event-group-2] essing.service.
--- [n-event-group-10] service.
--- [ost-stats-event] host.
--- 1077916, partition: 10, 
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-11] ervice
--- [-event-group-15] ervice
--- [-event-group-20] ervice
--- [-event-group-99] ervice
--- [-event-group-133] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice

want to grep lines containing [-event-group-13] only and all line which does not have pattern [-event-group-(digits)]

so result needed is

--- [ost-stats-event] host.
--- 1077916, partition: 10, 
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice

awk '!/-event-group-/{print} /-event-group-13/{print}' file gives 

--- [ost-stats-event] host.
--- 1077916, partition: 10, 
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-133] ervice  <- don't print this line
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice
2

There are 2 answers

0
Gilles Quénot On BEST ANSWER

Like this:

awk '!/-event-group-/{print} /-event-group-13]/{print}' file
                                             ^
                                         look here

or

awk '!/-event-group-/{print} /-event-group-13\y/{print}' file

\y is word boundary for GNU awk.

Yields:

--- [ost-stats-event] host.
--- 1077916, partition: 10, 
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice
0
Ed Morton On

You say you want:

to grep lines containing [-event-group-13] only and

all line which does not have pattern [-event-group-(digits)]

This does that using any awk:

$ awk '/\[-event-group-13]/ || !/\[-event-group-[0-9]+]/' file
--- [n-event-group-3] action
--- [n-event-group-8] action.service
--- [n-event-group-2] essing.service.
--- [n-event-group-10] service.
--- [ost-stats-event] host.
--- 1077916, partition: 10,
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice

but maybe this is what you actually want (still using any awk) as it produces the expected output you posted:

$ awk '/\[-event-group-13]/ || !/\[[^]]*-event-group-[0-9]+]/' file
--- [ost-stats-event] host.
--- 1077916, partition: 10,
--- [d | vm-cm-event] cm.service.
--- [d | vm-cm-eve] cm.service
error: not found
com.rom.nom
--- [-event-group-13] ervice
--- [-event-group-13] ervice
--- [-event-group-13] ervice