Command-Line

按每行的最後一個字元串分組列表

  • August 14, 2019

我有一個字元串列表(排序的 IP 地址範圍),如下所示:

10.100.0.0-10.100.255.255 External: 2.2.2.2
10.120.0.0-10.255.255.255 External: 2.2.2.2
10.0.0.0-10.255.255.255 External: 3.3.3.3
192.168.160.1-192.168.160.255 External: 3.3.3.3
and so on..

如何按每行的最後一個字元串對它們進行分組,以便結果類似於以下內容:

External: 2.2.2.2
 10.100.0.0-10.100.255.255
 10.120.0.0-10.255.255.255

External: 3.3.3.3
 10.0.0.0-10.255.255.255
 192.168.160.1-192.168.160.255

注意:不需要處理 IP 地址。我們可以將它們視為字元串,因為它們已經排序和排序。我正在尋找一個純 Bash 解決方案(不是 Python),最好沒有 xargs。

提前致謝!

記住變數中的最後一個外部 ip。如果新的ip不同,列印新的。然後列印ip範圍。

#! /bin/bash
last_ip=""
while read range _e ip ; do
   if [[ $ip != "$last_ip" ]] ; then
       printf '\nExternal: %s\n' "$ip"
   fi
   printf '  %s\n' "$range"
   last_ip=$ip
done < "$1"
awk '{

if($2$3 in STORE){

##make column 2 and column 3 as key to store address.
STORE[$2$3]=STORE[$2$3]"\n""\t"$1  ##add new line here 

}
else{
##if key not in STORE, add first column with a tab 
STORE[$2$3]="\t"$1 

}
}
##print everything using END 

END{
for(add in STORE){
print add"\n"STORE[add]
}
}' file.txt

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