根据多行匹配条件过滤文本

时间:2010-08-25 13:11:58

标签: sed awk

我有以下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

执行命令后,您将只获得peer作为输出。有人可以帮帮我吗?

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用单个nawk命令。而你可以失去无用的猫

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

您可以使用sed以及其他人提出的建议,但我更喜欢正则表达式并且不那么杂乱。 以上将网络名称的值保存为“n”。然后,获取下一行并针对“ims3”检查第二个字段。如果匹配,则打印“n”的值。

答案 2 :(得分:0)

因此,您需要以下行中的域名包含“ims3”的网络名称,而不是下一行包含“ims7”的网络名称(即使示例中的网络名称相同)。 / p>

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上测试。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

假设您想要域 ims3 的网络名称,此命令行无法使用 sed

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

答案 5 :(得分:0)

你只需要将-e几乎放在你在换行符处打破命令的任何地方或者用分号。您无需额外拨打sedawkcat

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