awk里正则匹配的问题

4901阅读 0评论2012-03-24 tjpm
分类:LINUX

人都有犯傻的时候。
我在整理DNS列表的时候需要总bind的一堆配置文件里直接把指定的IP地址对应的DNS记录(包括CNAME的)全部都获取出来。由于需要对IP地址、D域名进行精确的匹配,所以得使用"^,$"之类的限制符号来保证正确性。
由于匹配的时候使用的IP地址 域名是得作为变量输入,所以在使用awk的时候即便把变量传入了,但是不能直接在变量后使用^,$之类的字符去限定。所以我先使用的是下面这个脚本完成的任务。

点击(此处)折叠或打开

  1. #!/bin/bash
  2. IP=$1
  3. FILE=$2
  4. DNS=$(grep -E "\b$IP\b" $FILE |awk '{ a[$1]++} END{ for (i in a){gsub(/\.$/,"",i);print i}}')
  5. LIST="$DNS"
  6. for host in $DNS
  7. do
  8.    DCNAME=$( grep -E "\b$host.$" $FILE|awk '{a[$1]++} END{for (i in a){gsub(/\.$/,"",i);print i}}')
  9.    L=${#DCNAME}
  10.    if [ $L -gt 3 ];then
  11.         LIST="$LIST $DCNAME "
  12.    fi
  13. done
  14. echo $LIST
后来仔细想想其实下面的方式都可以很简单的达到目标


点击(此处)折叠或打开

  1. DNS=$(awk -v ip=$IP '{ if($3 == ip ){ a[$1]++ } } END{ for (i in a){gsub(/\.$/,"",i);print i}}' $FILE)
  2. DNS=$(awk -v ip=$IP '{ if($3 ~ "^"ip"$" ){ a[$1]++ } } END{ for (i in a){gsub(/\.$/,"",i);print i}}' $FILE)

  3.  DCNAME=$(awk -v H=$host '{ if ( $0 ~ "^"H".$") { a[$1]++}} END{for (i in a){gsub(/\.$/,"",i);print i}}' $FILE)



上一篇:screen简单配置
下一篇:keepalived主备切换后的arp问题