2013-05-20 27 views
0

我有一个文件的2个子节点,每个条目都在一行中。从一个文件中删除子串

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
grep -o 'HOST=[^)]*' tnsnamesMaster_March12_2013.ora | cut -c6- 

-o告诉grep命令只打印匹配的字符串,这将是HOST=直到但不包括第一个)。然后cutHOST=出来。

如果您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 
+0

嗨凯文。感谢回复。我无法在grep上使用-o选项。我改用grep -e'HOST = [^)] *'tnsnamesMaster_March12_2013.ora。裁剪似乎给了我其他语法问题,我无法得到我想要的东西。我也尝试了> grep -ep'(?<= HOST =)[^)] +'tnsnamesMaster_March12_2013.ora,但是即使在HOST的右括号之后,我也会得到所有的字符。这是AIX并使用bash shell。 – user2402291

+0

你有什么系统没有'-o'?如果给'cut'('-c 6-')添加一个空格,那就是posix,所以应该在任何合理的系统上工作。 – Kevin

+0

非常感谢凯文! sed命令像魅力一样工作。 – user2402291