2011-03-11 49 views
3
/^Host.*latency.*/{ 
    $!N 
    /MAC Address/{ 
     s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/ 
    } 
} 
/[Nn]map/d 
s/^Host .*is up/& but MAC Address cannot be found/ 

我想了解上面的sed腳本。可以幫助我理解我從來沒有像上面那樣使用過sed。 它的使用是試圖瞭解sed腳本中的嵌套括號

nmap -sP 192.168.1.0/20 | sed -f sedcript.sh 

回答

3

如果你指的是嵌套的括號內(\(.*\))。外部對是文字,內部的轉義對捕獲由正則表達式匹配的字符串。反向引用\1輸出這個捕獲的字符串。 \2反向引用輸出由第二對轉義括號捕獲的字符串。

如果你是指大括號,它們圍繞着命令塊。外部組說,如果該行匹配^Host.*latency.*,則執行隨附的命令。如果當前行不是最後一行,則$!N命令會附加文件的下一行。如果行的組合匹配MAC Address,則執行下一對大括號內的塊(執行替換)。

你可以這樣閱讀:

  • /^Host.*latency.*/{ - 如果該行此正則表達式匹配,則
    • $!N - 附加下一行,如果當前行不是最後一行
    • /MAC Address/{ - 如果組合線匹配此正則表達式,則
      • s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/ - 進行替換
    • } - END IF
  • } - END IF
  • /[Nn]map/d - 如果圖案空間(組合線)匹配這一點,然後將其刪除
  • s/^Host .*is up/& but MAC Address cannot be found/ - 使這種替換
+0

感謝您的優秀解釋。只有一個問題是什麼編程語言,我不知道它是一個sed腳本,shell,awk或perl? – 2011-03-11 17:41:23

+0

@RegisteredUser:我不知道我是否理解你的問題,因爲你題爲你的原始問題「... sed腳本」。是的,這是一個'sed'腳本。 – 2011-03-11 18:55:07

+0

好的,謝謝我現在明白了。 – 2011-03-12 05:45:29