2010-08-25 103 views
2

我有以下sed命令。我需要单行执行下面的命令:基于多行匹配条件筛选文本

cat File | sed -n '  
/NetworkName/ { 
N 
/\n.*ims3/ p 
}' | sed -n 1p | awk -F"=" '{print $2}' 

我需要在单行中执行上面的命令。任何人都可以请帮忙。

假设文件的内容是

System.DomainName=shayam 
System.Addresses=Fr6 
System.Trusted=Yes 
System.Infrastructure=No 
System.NetworkName=AS 
System.DomainName=ims5.com 
System.DomainName=Ram 
System.Addresses=Fr9 
System.Trusted=Yes 
System.Infrastructure=No 
System.NetworkName=Peer 
System.DomainName=ims7.com 
System.DomainName=mani 
System.Addresses=Hello 
System.Trusted=Yes 
System.Infrastructure=No 
System.NetworkName=Peer 
System.DomainName=ims3.com 

并执行命令后,你将只能得到同行的输出。任何人都可以请帮我吗?

+1

如果你正在寻找的只是“同行”,这是简单的方式: “猫文件| grep的同伴” 让你开始。 – 2010-08-25 13:19:37

回答

1

您可以使用一个NAWK命令。你可以失去了无用的猫

nawk -F"=" '/NetworkName/{n=$2;getline;if($2~/ims3/){print n} }' file 

您可以使用SED以及由他人提出的,但我更喜欢少正则表达式和减少混乱。 以上将网络名称的值保存为“n”。然后,获取下一行并检查第二个字段对“ims3”。如果匹配,则打印“n”的值。

+0

正在工作..谢谢:) :) – Raj 2010-08-25 13:52:00

+1

这可能有点更清楚:'nawk -F ='/ NetworkName/{name = $ 2} $ 2〜/ ims3/{print name}'' – 2010-08-25 15:48:28

1

将该代码放在单独的.sh文件中,并将其作为单行命令运行。

+0

避免了这个问题。 – 2010-08-25 13:39:35

0

因此,您需要网络名称,其中以下行中的域名包含'ims3',而不是下一行包含'ims7'(尽管示例中的网络名称相同)的网络名称。

sed -n '/NetworkName/{N;/ims3/{s/.*NetworkName=\(.*\)\n.*/\1/p;};}' File 

这也避免了滥用猫科动物(更不用说减少执行的命令的数量)。

经过MacOS X 10.6.4测试,但没有理由认为它不会在其他地方工作


然而,经验证据表明的Solaris sed距离的MacOS sed不同。它可以在同一个sed命令来完成,但它需要三条线:

sed -n '/NetworkName/{N 
/ims3/{s/.*NetworkName=\(.*\)\n.*/\1/p;} 
}' File 

测试在Solaris 10上

+0

嗨。 我刚贴在solaris机器上。它不工作。太多{'是我得到的错误..:( – Raj 2010-08-25 13:44:16

0
cat File | sed -n '/NetworkName/ { N; /\n.*ims3/ p }' | sed -n 1p | awk -F"=" '{print $2}' 
+0

滥用猫科动物?所有这些都可以通过一个'sed'命令来完成 – 2010-08-25 13:38:39

+0

他想知道如何编写他已经在一行上工作的命令,我向他展示了在哪里放置分号 – jkramer 2010-08-25 13:41:21

+0

以下是我收到的错误: sed:命令乱码:/ NetworkName/{N; /\n.*ims3/ p} – Raj 2010-08-25 13:46:27

0

假设您想要的网络名称域地IMS,这命令行工作没有sed的

grep -B 1 ims3 File | head -n 1 | awk -F"=" '{print $2}' 
+0

grep -B在solaris中不能正常工作:( – Raj 2010-08-25 13:48:25

0

你只需要把-e几乎放在任何地方,你会在换行符处打断命令或者使用分号。您不需要拨打sedawkcat的额外电话。

sed -n -e '/NetworkName/ {' -e 'N' -e '/\n.*ims3/ s/[^\n]*=\(.*\).*/\1/P' -e '}' File