This is sample of Cisco Switch configuration file. If the interface is not in use, it should be in shutdown mode.
config.txt
!
interface GigabitEthernet0/0
shutdown
!
interface GigabitEthernet0/1
!
interface GigabitEthernet0/2
shutdown
!
interface GigabitEthernet0/3
!
Therefore, I would like to grep any interfaces without any configuration and no shutdown in it.
Desired Output
!
interface GigabitEthernet0/1
!
!
interface GigabitEthernet0/3
!
Can I do something like grep interface.*[0-9] config.txt where the line before and after it must match !
Here are a few of my attempts, but none of them producing the output that I wanted.
grep interface.*[0-9] config.txt
grep -C1 interface.*[0-9] config.txt
If there is a better solution then grep, please let me know.
I suggest using a GNU grep (or pcregrep if you have no access to GNU grep) solution:
grep -Poz '(?m)^!\R\Kinterface.*\R(?=!$)' file
See the online grep demo and the regex demo.
Details
-Poz - P enables the PCRE regex engine to handle the regex, o forces to output just matching text and z enables grep to work with patterns matching across line breaks(?m)^!\R\Kinterface.*\R(?=!$) matches:
(?m) - a modifier making ^ match start of lines and $ match end of lines^ - start of a line! - a ! char\R - a line break sequence\K - match reset operator that omits all the text matched so far in the current matched text bufferinterface - a word.* - the rest of the line\R - a line break sequence(?=!$) - a positive lookahead that makes sure there is a ! char followed with the end of line.