Linux
根據文件中的第二個欄位對 IP 地址進行排序
在我的 ksh 腳本中,我需要添加以下任務( OS - linux/solaris )
我有以下文件
more test.txt /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 192.1.120 192.120.120 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2 193.23.2 /var/log/df 193.23.2.111 193.23.2.159
如何在文件開頭找到所有帶有4 個八位字節的 IP,然後是其他帶有3 個八位字節的 IP
備註 - 排序 IP 將根據第二個欄位
請求文件範例(排序後)
more test.txt /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2.111 193.23.2.159 /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 192.1.120 192.120.120 /var/log/df 193.23.2 193.23.2
解決方案可以用 sort 或 ksh/awk/sed/perl 一個 liner …等來完成
只要你有
GNU awk
你需要的單線:$ awk '{n=split($2,ip,".");if(n==4)print $0;else a[$2]=$0}END{n=asorti(a,b);for(i=1;i<=n;i++)print a[b[i]]}' file /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2.111 193.23.2.159 /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 192.1.120 192.120.120 /var/log/df 193.23.2 193.23.2
awk '{printf "%s.,%s\n", $2, $0}' | \ sed -E -e 's/^(([0-9]+\.){4}),/0.\1,/' -e 's/^(([0-9]+\.){3}),/1.\1,/' | \ sort -t. -k 1,1 -k 3,3 | \ sed -E -e 's/^[^,]+,//'`
這個想法是:
- 將相關欄位複製到每行的開頭並添加特殊分隔符(在這種情況下為逗號)
- 用於
sed
添加一些取決於 IP 地址中八位字節數的值(我使用 0 表示 4 個八位字節,使用 1 表示 3 個八位字節)- 對相關欄位的值進行排序
- 去掉我們添加的所有內容