2010-08-25 57 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