Linux

根據文件中的第二個欄位對 IP 地址進行排序

  • April 9, 2013

在我的 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/^[^,]+,//'`

這個想法是:

  1. 將相關欄位複製到每行的開頭並添加特殊分隔符(在這種情況下為逗號)
  2. 用於sed添加一些取決於 IP 地址中八位字節數的值(我使用 0 表示 4 個八位字節,使用 1 表示 3 個八位字節)
  3. 對相關欄位的值進行排序
  4. 去掉我們添加的所有內容

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