Bash脚本使用文本中的第二列,但保留结果中的第一列相关

时间:2015-02-16 11:31:14

标签: bash

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

还有一个好处是有一个脚本可以从3列的文件生成结果 - 日期,时间,IP地址。分隔符就是空间。 我试过这个,但没有。我是一个新手:)

这是我原来的剧本:

#!/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

输入文件示例

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

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

#!/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