我现在一直试图绕过这个问题几个小时,并且以为我会来这里寻求帮助。
我有一个我想要运行的日志文件中的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知识所以我放弃它以免我继续浪费时间!
非常感谢任何帮助。
答案 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"
输出格式化为以逗号分隔的字段,并且在使用range
和company
变量之前应该对它们进行一些修剪(以删除开头和结尾的空格),但是这样应该给你一个想法。
基本上,代码不会尝试将两个文件合并在一起,而是从源文件的每一行中提取字段,执行whois
,从中提取所需的两个字段,然后输出所有五个字段到输出没有中间步骤。