从文件中剪切子字符串

时间:2013-05-20 15:56:58

标签: shell

我有一个文件的2个tnsentries,条目类似,每个条目都在一行。

  

AAA_PRD =   (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = mmmm01.dimpotiso.org)(PORT = 1521)))(CONNECT_DATA =(SID = ORCL)))

     

BBB_PRD =   (DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = irkosdap01.nonprod.digrestsiso.org)(PORT = 1626))(CONNECT_DATA =(SID = BBBDFS)))^

HOST条目并不总是以相同的列长度开始。我想从主机中删除条目到主机的结束括号,或者更好的只是主机条目。

我想把结果作为

  

mmmm01.dimpotiso.org

     

irkosdap01.nonprod.digrestsiso.org

由于

我部分能够通过以下

从我的tnsnames.ora文件中获取信息
cat  tnsnamesMaster_March12_2013.ora | grep 'HOST' | cut -f2 -d 'HOST=' | cut -f2 -d'=' | cut -f1 -d ')'

1 个答案:

答案 0 :(得分:1)

grep -o 'HOST=[^)]*' tnsnamesMaster_March12_2013.ora | cut -c6-

-o告诉grep只打印匹配的字符串,该字符串最多为HOST=但不包括第一个)。然后cut表示HOST=

如果您的grep支持perl正则表达式,则可以通过将HOST=置于后备中来立即执行此操作:

grep -oP '(?<=HOST=)[^)]+' tnsnamesMaster_March12_2013.ora

显然-o不是POSIX,因此上述内容可能无效。据我所知,以下是严格遵守POSIX的,所以应该在任何地方工作:

grep HOST tnsnamesMaster_March12_2013.ora | sed 's/.*HOST=\([^)]*\)).*/\1/'

sed -n '/HOST/s/.*HOST=\([^)]*\)).*/\1/p' tnsnamesMaster_March12_2013.ora