awk学习_1


因为在网上看到这篇文章:脚本分享 之 天朝全静态路由 « Hey! Linux,比较感兴趣其中的shell脚本,所以看了看源码,觉得其中的用awk计算子网掩码的方法特别好,在此记录一下(下面截取的是我比较感兴趣的代码片段):

#!/bin/bash

basedir=$(dirname $0)
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
conf="${basedir}/delegated-apnic-latest"

function check_conf(){
  if [ ! -f ${conf} ]; then
    echo "No such file: ${conf}"
    echo "Please download it from http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
    exit 1
  fi
}

function add_routes(){
  oldgw=$(netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *([0-9.]*) .*/1/' | grep -Ev '^$')
  #dscacheutil -flushcache

  all_subs=$(grep CN ${conf} | grep ipv4 | awk -F '|' '{print $4"/"$5}')
  echo -n "Adding the routes..."
  for subnet in ${all_subs}
  do
    subneti=$(echo ${subnet} | cut -d/ -f1)
    rawnetm=$(echo ${subnet} | cut -d/ -f2)
    subnetm=$(awk -v c=${rawnetm} 'function log2(x){if(x<2)return(pow);pow--;return(log2(x/2))}BEGIN{pow=32;print log2(c)}')
    route add ${subneti}/${subnetm} "${oldgw}" > /dev/null
  done
  echo " Done"
}

其中:

all_subs=$(grep CN delegated-apnic-latest | grep ipv4 | awk -F ‘|’ ‘{print $4″/”$5}’)
for subnet in ${all_subs}
do
subneti=$(echo ${subnet} | cut -d/ -f1)
rawnetm=$(echo ${subnet} | cut -d/ -f2)
subnetm=$(awk -v c=${rawnetm}function log2(x){if(x<2)return(pow);pow–;return(log2(x/2))}BEGIN{pow=32;print log2(c)}‘)
done
echo ” Done”

因为delegated-apnic-latest这个文件中的第5列为划分给的IP地址块,第6列为地址块中的个数,由此计算对应的子网掩码,这里用的awk方法对于我来说感觉非常惊艳!


还有就是dirname命令的学习(示例说明了一切):

NAME
dirname – strip last component from file name

SYNOPSIS
dirname NAME
dirname OPTION

DESCRIPTION
Output NAME with its last non-slash component and trailing slashes removed; if NAME contains no /’s, output `.’ (meaning the current directory).

–help display this help and exit

–version
output version information and exit

EXAMPLES

dirname /usr/bin/
Output “/usr”

dirname stdio.h
Output “.”

SEE ALSO
basename(1), readlink(1)

GNU coreutils 8.12.197-032bb September 2011 DIRNAME(1)


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注