使用文本文件作为输入源

时间:2012-07-03 12:42:52

标签: linux shell unix

好的,基本上我希望能够使用这种格式的文本文件:

www.website.com 443 123.456.789.098
www.website2.com 443 765.432.101.234
....

作为输入源,其中脚本将获取网站地址并将其保存在变量中,并且与端口和IP地址相同。所以它看起来像这样:

website=www.website.com
port=443
ip=123.456.789.098

到目前为止,我已经尝试过这个:

for line in [ cat $file_name ]; do
    website=`echo $line | cut -d" " -f1`
    port=`echo $line | cut -d" " -f2`
    ip=`echo $line | cut -d" " -f1`

但当我回应变量时,我得到的是:

[
[
[

我似乎无法弄清楚如何解决这个问题。

3 个答案:

答案 0 :(得分:3)

请改用此模式:

while read line ; do
    ... loop body ...
done < "$file_name"

说明:for var in word-list将按顺序将列表中的单词分配给变量。因此,对于第一个循环,$line将扩展为[(列表中的第一个单词)。下一个单词是cat,然后是file_name的值。

要从文件中读取,您需要使用I/O redirection

另一方面,

while将执行您作为参数传递的命令(read line)。 read将从stdin读取一行,并将值放入您作为参数传递的变量中。

奇数done < $file_name设置stdin以供阅读。为了让您的生活更加简单,您可以使用read为您分割输入:

while read website port id ; do
    ...

答案 1 :(得分:2)

while read WEBSITE PORT IP
do 
    echo $WEBSITE $IP $PORT ; 
done < file

但是在循环结束后你将无法使用这些变量。

答案 2 :(得分:2)

for默认情况下不会逐行读取,而是读取由$ IFS分隔的标记。默认情况下,IFS通常包含空格,制表符和换行符。如果你想强制bash逐行读取(而不是以空格分隔的标记),你可以这样做:

IFS=`echo -ne '"\n"'`; for line in `cat $file`; do echo $line; done

请注意围绕cat $file执行cat'内联'的反引号。

使用read是另一种选择。当然比更改IFS(内部字段分隔符)

更容易阅读和理解