我正在尝试运行这样的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,
我的剧本哪里错了?
答案 0 :(得分:1)
对for
使用cat
循环不是逐行处理文件的好方法。我建议将脚本更改为:
#!/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"
这将截断输出文件并将循环的所有输出写入其中。将命令替换以及参数扩展括在双引号中可以防止在命令输出中扩展字符时出现问题。
答案 1 :(得分:0)
最有可能产生换行符的应用程序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
答案 2 :(得分:0)
好的,我发现了问题。输入文件的第一行是空的,脚本以某种方式决定按照我的描述工作。当我删除那条空行时,一切正常。