免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1920 | 回复: 7
打印 上一主题 下一主题

[文本处理] 【求教】一个文本模式匹配的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-19 21:20 |只看该作者 |倒序浏览
本帖最后由 stackman 于 2012-11-13 02:40 编辑

某文件中有若干个如下格式的段落:
host $clientname {
        hardware ethernet ${mac};
        fixed-address     ${ip};
}

Q1: 已知$clientname,如何得到$ip的值?
Q2: 已知$mac,如何得到$ip的值?

例如:文件dhcpd.conf文件内容如下:
  1. host H001
  2.        {
  3.   hardware ethernet 00:40:05:43:06:5F;
  4.   fixed-address 10.0.42.113;
  5.        }

  6. #host H004
  7. host H002
  8.        {
  9.   #hardware ethernet 00:15:f2:a0:1f:aa;
  10. #  hardware ethernet 00:15:f2:a0:1f:bb;
  11.   hardware ethernet 00:15:f2:a0:1f:cc;
  12.   #fixed-address 10.0.42.178;
  13.   fixed-address 10.0.42.17;

  14.        }

  15. host H003 {
  16.   hardware ethernet 00:E0:4C:30:EA:44;
  17.   fixed-address 10.0.42.100;
  18.        }

  19. host H004
  20.        {  hardware ethernet 00:E0:4C:60:8C:9D;
  21.   fixed-address 10.0.42.101;
  22.        }
复制代码
当给出H001时,需要输出10.0.42.113;
当给出00:40:05:43:06:5F时,需要输出10.0.42.113;

请特别注意
- H001字段与H002, H003及H004段落在格式上的略有区别;
- L7(第7行) vs. L8 和L13 vs. L11;

另外,在同一个子网内,如何不利用文本分析的方式在已知某主机mac的情况下得到其对应的ip地址?

如有答案,请稍做分析,小弟万分感谢!

论坛徽章:
0
2 [报告]
发表于 2012-07-20 08:48 |只看该作者
本帖最后由 dahaoshanhe 于 2012-07-20 09:05 编辑

先把你给的文件换个格式
  1. cat file | grep -v "#" | awk 'BEGIN{RS="host"}{$1=$1; print $0}'  > nfile
复制代码
  1. ./ak
  2. cat ak

  3. echo "type you mac or IP :"
  4. read a
  5. awk -v m=$a '{
  6.                for(i=1;i<=NF;i++)
  7.                    if(m~/^H/&&$i==m )
  8.                    { print $(i+4) ; break }
  9.                    if(m~/^0/)
  10.                   {
  11.                     a[$5]=$7  
  12.                   }
  13.              }
  14. END{ print a[m]}
  15. ' nfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-07-20 09:25 |只看该作者
  1. sed -nr '/host/{:1 N;/}/!b1;/H002/{s/(.*)([ \t]*fixed-address )([^;\n]*)(;.*)/\3/p}}' data
复制代码
H002/fixed-address 可以换成变量

论坛徽章:
0
4 [报告]
发表于 2012-07-22 01:30 |只看该作者
本帖最后由 imaoxian 于 2012-07-22 01:32 编辑

  1. awk '!/#/' FILE | grep -A3 HOST | awk -F'[ ;]' '/fixed-address/ {print $4}'
  2. awk '!/#/' FILE | grep -A3 HOST | awk -F'[ ;]' '/hardware ethernet/ {print $5}'
复制代码
使用时  更换FILE 和 HOST即可
  1. 运行结果
  2. [root@localhost tmp]# awk '!/#/' test | grep -A3 H003 | awk -F'[ ;]' '/fixed-address/ {print $4}'
  3. 10.0.42.100
  4. [root@localhost tmp]# awk '!/#/' test | grep -A3 H003 | awk -F'[ ;]' '/hardware ethernet/ {print $5}'
  5. 00:E0:4C:30:EA:44
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2012-07-23 14:24 |只看该作者
Q1: 已知$clientname,如何得到$ip的值?
  1. clientname="H001"
  2. awk -v name=$clientname '/host/{t=1;host=$2} /}/ {t=0;host=""} {if (t&&host==name&&/fixed-address/&&!/#/) print $NF}' file
复制代码
Q2: 已知$mac,如何得到$ip的值?
  1. mac=00:40:05:43:06:5F
  2. awk -v name=$mac '/host/{t=1;ip="";mac=""} /}/&&t&&mac{print ip;t=0} t {if (/hardware ethernet/&&$NF~name&&!/#/) mac=$NF;if (/fixed-address/&&mac) ip=$NF}' file
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-07-24 19:44 |只看该作者
本帖最后由 巽离linux 于 2012-07-24 20:08 编辑

定义输入记录分割符,根据指定的H001、H002将文件分段
awk 'BEGIN { RS="host"} $0~/H001/ {print $0} ' filename 得到如下记录,再结合管道使用sed
H001
       {
  hardware ethernet 00:40:05:43:06:5F;
  fixed-address 10.0.42.113;
       }
匹配到非#开头的fixed-address 替换该行为后面的ip地址:
awk 'BEGIN { RS="host"} $0~/H001/ {print $0} ' filename | sed -n 's/[^#]fixed-address \([0-9.]\)/\1/p'
H001输出10.0.42.113;
H002输出 10.0.42.17;

根据mac匹配的思路同上
awk 'BEGIN { RS="host"} $0~/00:40:05:43:06:5F/ {print $0} ' grepip | sed -n 's/[^#]fixed-address \([0-9.]\)/\1/p'

论坛徽章:
0
7 [报告]
发表于 2012-11-13 02:34 |只看该作者
本帖最后由 stackman 于 2012-11-13 02:35 编辑
rdcwayx 发表于 2012-07-23 14:24
Q1: 已知$clientname,如何得到$ip的值?Q2: 已知$mac,如何得到$ip的值?

能否解释一下语句的意思,谢谢了。


   

论坛徽章:
0
8 [报告]
发表于 2012-11-13 02:36 |只看该作者
本帖最后由 stackman 于 2012-11-13 02:37 编辑


另外,在同一个子网内,如何不利用分析dhcpd配置文件的方式在已知某主机mac的情况下得到其对应的ip地址?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP