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

Bash脚本使用txt中的第二列,但将结果中的第一列保留为相关列,bash,Bash,我正试图编写一个bash脚本来简化IP信息收集过程。 现在我已经制作了一个脚本,它在多个文件中的一列IP地址中运行,查找地理位置和主机信息,并将其存储到一个新文件中 最好还有一个脚本,它可以从包含3列(日期、时间、ip地址)的文件中生成结果。分隔符是空间。 我尝试过这个和那个,但没有。我完全是个新手: 这是我的原创剧本: #!/usr/bin/env bash find *.txt -print0 | while read -d $'\0' file; do for i in

我正试图编写一个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

你能在这方面帮助我吗?

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

#!/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的文件只在该文件不在任何子目录下时才起作用,所以我猜您会希望用basename修复它;或者,查找循环应该替换为*.txt中的简单for文件。

请使用预期输出更新问题很有趣,为什么在windows上打开的结果文件不是多行格式的?啊。如果您确实需要在Windows上使用该文件,那么在Windows上使用适当的文本编辑器可能会更好。