【问题标题】:Perl file parsingPerl 文件解析
【发布时间】:2016-01-22 09:50:09
【问题描述】:

我有一个包含以下文本的文件:

1152  39.955534 138.59.102.xxx -> 172.27.37.xxx HTTP 581 HTTP/1.1 200 OK  (JPEG JFIF image)

1188  42.626056 35.183.215.xxx -> 172.27.37.xxx HTTP 474 HTTP/1.1 302 Moved Temporarily

1214  42.661556 159.70.229.xxx -> 172.27.37.xxx HTTP 1496 HTTP/1.1 200 OK  (GIF89a)
...<truncated> 

我一直在尝试(失败)用下面的 Perl 代码解析它。我想每行打印两个 IP 地址减去垃圾。下面的字符串:

perl -anle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&' < my_input_file

字符串只输出第一列IP: 138.59.102.xxx 35.183.215.xxx 159.70.229.xxx

但无法打印 172.27.xxx.xxx 地址。如果 bash 或 Python 有效,我不反对任何帮助。

【问题讨论】:

  • 你不需要-a——它启用autosplit并填充数组@F。最好将您的文件作为 参数 提供给 perl,而不是通过 STDIN 推送它

标签: python regex bash perl parsing


【解决方案1】:

大概是这样的吧?

perl -lne 'print $& while /[0-9x]{1,3}\.[0-9x]{1,3}\.[0-9x]{1,3}\.[0-9x]{1,3}/g' my_input_file

【讨论】:

    【解决方案2】:

    我不知道 perl 但这是一种 python 方式

    ifile = open('example.txt','r')
    ofile = open('output.txt','w')
    for line in ifile:
      for ip in re.findall(r'(?:\d{1,3}\.){3}\d{1,3}',line):
        print (ip,file = ofile) 
    

    【讨论】:

    • 你缺少正则表达式中的点
    • 啊啊啊啊啊啊。我以前有一个丑陋的,所以我试图修复它,我想我一定拿出了太多东西。谢谢@Borodin :)
    猜你喜欢
    • 2012-06-08
    • 2019-05-19
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2019-10-10
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多