2016-04-08 33 views
1

我有一個文本文件是這樣的:我如何用awk grep IP塊?

1|2|3|4|5|6|7|8|9|192.168.1.1 
1|2|3|4|5|6|7|8|9|192.168.2.1 
1|2|3|4|5|6|7|8|9|192.168.22.1 
1|2|3|4|5|6|7|8|9|192.168.222.1 

我需要打印,如果$ 10點開始用,這樣的 「192.168.2。」:

1|2|3|4|5|6|7|8|9|192.168.2.1 

我想是這樣的(我用VAR因爲我從其他文件中這一IP模塊,這只是樣品):

awk -v var="192.168.2." -F'|' '{if ($10 ~ "^" var) print $0;}' 

輸出:

1|2|3|4|5|6|7|8|9|192.168.2.1 
1|2|3|4|5|6|7|8|9|192.168.22.1 
1|2|3|4|5|6|7|8|9|192.168.222.1 

我該如何解決這個問題?爲什麼在var中最後一個.不工作?

+1

嘗試在if塊中打印$ 10。 – kakurala

+1

如果你將字段正則表達式,你也可以使用'grep'。 'IP = 「192.168.2。」 && IP = $(sed's /\./\\./ g'<<<「$ {IP}」)&& grep -E「^([^ |] * [|]){9} $ {IP }「input.txt」 –

回答

2

使用此awk

awk -v var="192[.]168[.]2[.]" -F'|' '$10 ~ var{print}' file 

如果你不能改變輸入IP格式,請嘗試以下。

awk -v var="192.168.2." -F'|' 'BEGIN{gsub("[.]", "\\.", var)} $10 ~ var{print}' 

輸出:

1|2|3|4|5|6|7|8|9|192.168.2.1 
+1

正確,但不需要'{print}',因爲這是默認行爲除了IP地址不總是以3位開頭,然後你需要'awk ...'$ 10〜「^」之後, var'file'來定位它。 –

1

.字符是通配符。您應該用\.替換您的匹配字符串中的實例,並且應該用/圍繞正則表達式。如果你想參數化的IP地址,它可能是整潔爲你做這個

var="192\.168\.2\." 
awk -F'|' '{if ($10 ~ /^'${var}'/) print $0;}' 

你可能還喜歡用awk的模式規則的語義:

awk -F'|' '$10 ~ /^'${var}'/ {print $0}' 

這是一個小整潔。

您可以逃脫你的IP地址,如下所示:

var=$(echo ${var} | sed 's/\./\\./g') 
+0

對不起,正則表達式應該放在'/'而不是''中 – robert

+0

我試圖說的是'\'沒有給出預期的輸出,因爲'awk'被視爲普通的' – sat

+0

我提供的第二種形式是......不確定如何使用''f''版本拖拽工作... – robert

1
gawk -F"|" 'match($10, "192.168.2.*") {print}' input-file 

我得到以下輸出:

1|2|3|4|5|6|7|8|9|192.168.2.1 
1|2|3|4|5|6|7|8|9|192.168.22.1 
1|2|3|4|5|6|7|8|9|192.168.222.1 

我想這是實現這一最簡單的方法。

+1

OP表示IP可能會動態改變。 – sat