Chinaunix

标题: 这样的文本如何提取?? [打印本页]

作者: oneouts    时间: 2012-07-27 14:05
标题: 这样的文本如何提取??
本帖最后由 oneouts 于 2012-07-27 14:19 编辑

   <td align="left"><span class="row_proxy_ip">110.139.99.207</span
   </td>
         
         
          <td align="left"><span class="row_proxy_port">proxy list - port 8080">8080</a>       </span>   </td>
         
         
         
         <td align="left"><div class="last_check" data-time="114"></div></td>     
         

          <td align="left">
         
                    
            <a title="Indonesian proxy list elite">china<span style="color:#666666; font-size:10px;"> - Pontianak</span></a>          </td>

。。。。。。。。

在这个文本中提取ip ,port,国家
就像
110.139.99.207   8080    china
.......


请问awk 的脚本如何实现啊
谢谢
作者: personball    时间: 2012-07-27 14:09
awk 的甲苯。。这是什么。。。
作者: personball    时间: 2012-07-27 14:12
提取ip
  1. grep -oP '\d+.\d+.\d+.\d+'
复制代码

作者: oneouts    时间: 2012-07-27 14:20
这个ip 是取出来了但是端口和国家呢》?
如何把这3个选项放在一行

作者: zooyo    时间: 2012-07-27 14:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: personball    时间: 2012-07-27 14:26
端口
  1. grep -oP "(?<=port )\d+"
复制代码
国家感觉没啥特殊标记



作者: personball    时间: 2012-07-27 14:27
title="Indonesian proxy list elite"
这个title会变化么?如果后面的china变了的话。。
作者: oneouts    时间: 2012-07-27 14:28
这只是一部分而已啊。
还有好多个与上面一样的文本,手动会死人 的啊
求指教。。
把这些文本能成这样
110.139.99.207   8080    china
110.139.99.207   8080    usa
。。。。
。。

谢谢了

作者: oneouts    时间: 2012-07-27 14:33
不会的
你想用RS 这选项吗
作者: personball    时间: 2012-07-27 14:34
回复 8# oneouts


    先回答7L问题
作者: personball    时间: 2012-07-27 14:36
回复 9# oneouts

国家
  1.     personball@vostro:~$echo '<a title="Indonesian proxy list elite">china<span'|grep -oP "(?<=elite\">)\w+"
  2. china
  3. personball@vostro:~$
复制代码

作者: oneouts    时间: 2012-07-27 14:36
这个title会变化么?如果后面的china变了的话。
不会变


其实我想用RS把这些文本先分段,然后在每个段中找数据,把他们在放一块
作者: oneouts    时间: 2012-07-27 14:40
如何把这些数据放在一行输出呢???
类似这样
111.111.111.111      80    china

作者: personball    时间: 2012-07-27 14:41
回复 12# oneouts
  1. personball@vostro:SHELL$./1.sh txt
  2. 110.139.99.207 8080 china
  3. personball@vostro:SHELL$cat 1.sh
  4. #!/bin/bash
  5. ip=`grep -oP "\d+.\d+.\d+.\d+" $1`
  6. port=`grep -oP "(?<=port )\d+" $1`
  7. contry=`grep -oP "(?<=elite\">)\w+" $1`
  8. echo $ip" "$port" "$contry
  9. personball@vostro:SHELL$
复制代码

作者: personball    时间: 2012-07-27 14:42
本帖最后由 personball 于 2012-07-27 14:46 编辑

回复 12# oneouts


    不要太钻牛角尖。。。


提取国家这行,改成下面这种,严格点
  1. personball@vostro:SHELL$echo '<a title="Indonesian proxy list elite">china<span s'|grep -oP "(?<=elite\">)[^<]*"
  2. china
  3. personball@vostro:SHELL$
复制代码

作者: oneouts    时间: 2012-07-27 15:27
谢谢猫兄
还有个疑问
就是如何打出位于匹配文字之间的内容
olor:#666666; font-size:10px;"> - Bontang</span></a> | grep -oP "\w+(?</span></a>)

我想打出bontang
可是打出 Bontang</span></a>?
还有awk 有没有类似的功能
作者: personball    时间: 2012-07-27 15:37
本帖最后由 personball 于 2012-07-27 15:42 编辑

回复 16# oneouts
  1.     personball@vostro:mysql$echo 'olor:#666666; font-size:10px;"> - Bontang</span></a>'|grep -oP "(?<= - )[^<]*"
  2. Bontang
  3. personball@vostro:mysql$
复制代码
一定要用awk,肯定也可以的
只是个人觉得awk不适合这种场合

补充个另一种零宽断言
  1. personball@vostro:mysql$echo 'olor:#666666; font-size:10px;"> - Bontang</span></a>'|grep -oP "[^>]*(?=</span></a>)"
  2. - Bontang
  3. personball@vostro:mysql$
复制代码

作者: oneouts    时间: 2012-07-27 16:14
grep -oP "[^>]*(?=</span></a>)
请问这个正则是什么意思啊??
"[^>]是以>开头对吧
*是匹配任意一个字符
?是匹配一次or 0次字符在这里可以不写吗?




作者: oneouts    时间: 2012-07-27 16:24
原来是
零宽断言
我看了
负向零宽断言
嘿嘿
谢谢了
开来
需要买本书好好学学正则了
作者: personball    时间: 2012-07-27 16:25
回复 19# oneouts


    "[^>]是以>开头对吧

这个。。。
[^>] 表示  非>字符

作者: oneouts    时间: 2012-07-27 16:38
我这太菜了
好好学习
谢谢了





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2