使用BASH和grep将whois格式化为CSV

时间:2017-01-16 22:38:22

标签: linux bash csv awk grep

我现在一直试图绕过这个问题几个小时,并且以为我会来这里寻求帮助。

我有一个我想要运行的日志文件中的IP地址的CSV文件,并从中获取WHOIS netrange和公司名称,然后将结果附加到CSV的末尾。

到目前为止,我设法做的是将whois结果转换为单独的csv

echo ip, company, > result.csv
for ip in $(grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" source.csv); do 
    whois $ip | grep -i -e 'netrange\|inetnum' -e 'org-name\|orgname' \
    | awk 'BEGIN{FS="NetRange:|inetnum:|OrgName:|org-name:"} {print $2","$3}'
    |xargs; done >> result.csv

我的挑战是如何将我的2个新列添加回source.csv?我尝试过使用

paste -d, source.csv result.csv

但所有发生的事情都是result.csv中的值覆盖了source.csv的前几列

我的source.csv看起来像下面的

ip address       requests   number of visits
66.249.90.77      2149      200
66.249.66.1       216       233   

我的result.csv

ip range                     company
66.249.64.0 - 66.249.95.255 Google Inc.
66.249.64.0 - 66.249.95.255 Google Inc.

我希望我的最终csv看起来像

ip            requests  number of visits    ip range               company
66.249.90.77    2149    200           66.249.64.0 - 66.249.95.255   Google Inc.
66.249.66.1      2161   233           66.249.64.0 - 66.249.95.255   Google Inc.

如果可能的话,我宁愿用BASH来完成这个,而不是安装任何第三方工具等。我已经尝试了python包ipwhois但我的python知识远远少于我有限的BASH知识所以我放弃它以免我继续浪费时间!

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

尝试将其放入脚本文件中并在包含数据文件的目录中运行。

#!/bin/bash -ue

# Pattern for spacing characters
sp="[[:space:]]*"

#Pattern for non-spacing characters
nsp="[^[:space:]]+"

# Iterate on each line in the data file
while IFS= read -r line
do
  [[ "$line" =~ ^$sp($nsp)$sp($nsp)$sp($nsp)$sp$ ]] || continue
  f1="${BASH_REMATCH[1]}"
  f2="${BASH_REMATCH[2]}"
  f3="${BASH_REMATCH[3]}"
  # Extract information from whois
  whois_data="$(whois "$f1")"
  range="$(grep NetRange  <<<"$whois_data" | cut -f2 -d":")"
  company="$(grep OrgName <<<"$whois_data" | cut -f2 -d":")"
  echo $f1,$f2,$f3,$range,$company
done <"source.csv"

输出格式化为以逗号分隔的字段,并且在使用rangecompany变量之前应该对它们进行一些修剪(以删除开头和结尾的空格),但是这样应该给你一个想法。

基本上,代码不会尝试将两个文件合并在一起,而是从源文件的每一行中提取字段,执行whois,从中提取所需的两个字段,然后输出所有五个字段到输出没有中间步骤。