我正在尝试运行这样的sh脚本来收集有关Ip地址的地理信息。inputfile.txt只是一个包含ip地址的单列文件。
以下是我的输入文件的示例:
213.100.122.171
213.100.126.188
213.100.129.186
213.100.18.247
213.100.23.238
213.100.26.151下面是我使用的代码:
#!/usr/bin/env bash
output=outputfile.csv
for i in $( cat "inputfile.txt");
do echo -e "$i,"$( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $i | cut -d' ' -f6,8-9)"" >> $output;
done当我运行这个文件时,结果如下所示
213.100.126.188
,LV, N/A, N/A,
213.100.129.186
,SE, N/A, N/A,
213.100.18.247
,LV, N/A, N/A,
213.100.23.238
,LV, N/A, N/A我想让他们排在各自的队伍里,就像
213.100.126.188,LV, N/A, N/A,
213.100.129.186,SE, N/A, N/A,
213.100.18.247,LV, N/A, N/A,
213.100.23.238,LV, N/A, N/A,我的脚本哪里错了?
发布于 2015-02-13 20:47:55
在cat中使用for循环不是逐行处理文件的好方法。我建议将您的脚本更改为如下所示:
#!/bin/bash
output=outputfile.csv
while read -r line; do
echo -e "$line, $( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat "$line" | cut -d' ' -f6,8-9)"
done < inputfile.txt > "$output"这将截断输出文件,并将循环的所有输出写入其中。用双引号括起命令替换和参数扩展可防止命令输出中的字符扩展问题。
发布于 2015-02-13 20:45:56
它很可能是生成换行符应用程序geoiplookup。因此,您必须通过sed管道输出槽来删除它:
for i in $( cat "inputfile.txt");
do echo -e "$i,"$( geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $i | \
cut -d' ' -f6,8-9 | sed ':a;N;$!ba;s/\n/)"" >> $output;
done发布于 2015-02-13 21:22:05
好了,我找到问题了。输入文件的第一行是空的,脚本不知何故决定按照我所描述的那样工作。当我删除那行空行时,一切都很正常。
https://stackoverflow.com/questions/28499766
复制相似问题