從文本中提取 IP 地址並將其儲存在變數中
我有一個名為 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 地址始終是該文件的第二個欄位,您可以使用
awk
或cut
提取它。awk '{print $2}' abd
或者
cut -d' ' -f2 abd
如果您需要遍歷 IP 地址,可以使用通常的
for
or循環。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