组合两个变量并输出到文件时避免使用新行

时间:2015-02-13 12:35:59

标签: bash echo cat

我正在尝试运行这样的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,

我的剧本哪里错了?

3 个答案:

答案 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)

好的,我发现了问题。输入文件的第一行是空的,脚本以某种方式决定按照我的描述工作。当我删除那条空行时,一切正常。