Shell-Script

從文本中提取 IP 地址並將其儲存在變數中

  • March 19, 2019

我有一個名為 abd 的文本文件,如下所示。

48878 128.206.6.136
34782 128.206.6.137
12817 23.234.22.106

我只想從文本中提取 IP 地址並將其儲存在變數中並用於其他目的。

我試過這個。

for line in `cat abd`
do

ip=`grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $line`

echo $ip

done

我收到如下錯誤

grep: 34782: No such file or directory

grep: 128.206.6.137: No such file or directory

grep: 12817: No such file or directory

grep: 23.234.22.106: No such file or directory

我不知道這裡出了什麼問題。任何幫助,將不勝感激。

你幾乎第一次就做對了。答案對您的awk具體情況有好處,但您收到錯誤的原因是因為您試圖使用grep它,就好像它正在搜尋文件而不是變數一樣。

另外,在使用正則表達式時,我總是使用grep -E只是為了安全。我還聽說反引號已被棄用,應替換為$().

grep在支持herestrings的 shell 上使用變數的正確方法是使用其中 3 個傢伙的輸入重定向:<,因此您的grep命令($ip變數)實際上應該如下所示:

ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"

如果它是您正在搜尋的文件,我總是使用while循環,因為它可以保證逐行執行,而for如果有任何奇怪的間距,循環通常會被丟棄。您還實現了一個無用的使用,cat也可以用輸入重定向來代替。試試這個:

while read line; do
 ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
 echo "$ip"
done < "abd"

另外,我不知道grep您使用的是什麼作業系統或版本,但是當我過去使用此命令時,通常不需要大括號之前的轉義字元。它可能來自使用grep -E,或者因為我在引號中使用它並且沒有反引號 - 我不知道。您可以嘗試使用或不使用它,然後看看會發生什麼。

無論您使用for循環還是while循環,這取決於在您的特定情況下哪一個適合您,以及執行時間是否至關重要。在我看來,OP 似乎並沒有嘗試為每個 IP 地址分配單獨的變數,而是他想為行內的每個 IP 地址分配一個變數,以便他可以在循環本身中使用它——其中如果他$ip每次迭代只需要一個變數。在這個問題上,我堅持我的觀點。

如果 IP 地址始終是該文件的第二個欄位,您可以使用awkcut提取它。

awk '{print $2}' abd

或者

cut -d' ' -f2 abd

如果您需要遍歷 IP 地址,可以使用通常的foror循環。while例如:

for ip in $(cut -d' ' -f2 abd) ; do ... ; done

或者

awk '{print $2}' abd | while read ip ; do ... ; done

或者您可以將所有 IP 地址讀入一個數組:

$ IPAddresses=($(awk '{print $2}' abd))
$ echo "${IPAddresses[@]}"
128.206.6.136 128.206.6.137 23.234.22.106

引用自:https://unix.stackexchange.com/questions/243083