首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用txt中的第二列的Bash脚本,但在结果中保持第一列为相关

使用txt中的第二列的Bash脚本,但在结果中保持第一列为相关
EN

Stack Overflow用户
提问于 2015-02-16 11:31:13
回答 1查看 102关注 0票数 0

我正在尝试编写bash脚本,以简化IP信息收集过程。现在,我已经做了一个脚本,它运行在多个文件中的IP地址的一列中,查找geo和主机信息并将其存储到一个新文件中。

更好的是,还有一个脚本,它可以从具有3列(日期、时间、ip地址)的文件中生成结果。分隔符是空间。我试过了,但是没有。我是个十足的新手

这是我的原稿:

代码语言:javascript
复制
#!/usr/bin/env bash
find *.txt -print0 | while read -d $'\0' file;
do
        for  i in $( cat "$file")
        do echo -e "$i,"$( geoiplookup -f "/usr/share/GeoIP/GeoLiteCity.dat" $i | cut -d' ' -f6,8-9)" "$(nslookup $i | grep name | awk '{print $4}')"" >> "res/res-"$file".txt";
        done
done

输入文件示例

代码语言:javascript
复制
2014-03-06 12:13:27     213.102.145.172
2014-03-06 12:18:24     83.177.253.118
2014-03-25 15:42:01     213.102.155.173
2014-03-25 15:55:47     213.101.185.223
2014-03-26 15:21:43     90.130.182.2

你能帮我一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-16 12:05:33

目前的代码试图做什么还不完全清楚,但是这里有一个希望有用的重构,它至少可以作为一个起点。

代码语言:javascript
复制
#!/usr/bin/env bash
find *.txt -print0 | while read -d $'\0' file;
do
    while read date time ip; do
        geo=$(geoiplookup -f "/usr/share/GeoIP/GeoLiteCity.dat" "$ip" |
             cut -d' ' -f6,8-9)
        addr=$(nslookup "$ip" | awk '/name/ {print $4}')
        #addr=$(dig +short -x "$ip")
        echo "$ip $geo $addr"
    done <"$file" >"res/res-$file.txt"
done

我的nslookup副本没有输出四个字段,但我假设脚本的一部分是正确的。dig +short的输出更适合于机器处理,因此可能会切换到机器处理。也许geoiplookup还提供了一个输出机器可读的结果的选项,或者可能有一个替代的接口。

我认为您的脚本输出部分逗号分隔、部分空格分隔的结果是错误的,所以我也改变了这一点。如果您想让其他工具能够读取这个输出,也许您应该使用CSV或JSON。

尝试生成一个名为res/res-$file.txt的文件只有在file不在任何子目录时才能工作,所以我猜您会想用basename来修复这个问题;或者也许find循环应该替换为一个简单的for file in *.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28540475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档