我有一个如下格式的文件
User:blala
Pass:blala
IP:***.***.**.**
我尝试使用 IFS 但它不起作用
input="/path/to/your/input/file.cvs"
while IFS=',' read -r f1 f2 f3 f4 f5 f6 f7
do
echo "$f1 $f2 $f3 $f4 $f5 $f6 $f7"
done < "$input"
我想在我的 shell 脚本中获取用户、通行证、IP 值。
请帮忙。
答案1
使用 可能很诱人eval
,但由于密码可以包含任意字符(可以/将作为代码执行),因此存在风险;接近于简单明了:“不要这样做!”。
这有效 -使用数组。
测试文件的内容
User:blala
Pass:blala with spaces: and colons: and $PATH
IP:***.***.**.**
set -f # disable globbing
IFS=$'\n' # 'word' split only at newline char
value=($(sed 's/:/\n./' file)) # '.' to cater for empty value fields
echo user="${value[1]/./}"
echo pass="${value[3]/./}"
echo ip="${value[5]/./}"
输出:
user=blala
pass=blala with spaces: and colons: and $PATH
ip=***.***.**.**
答案2
我不太确定我是否明白你的问题的要点。
首先:IFS是一个变量,它包含一个分隔符,比如制表符、空格之类的。默认情况下,它包含空格、制表符和换行符。
编辑:
从for
-loop 循环到while
-loop,由 terdon 建议
while read line
do
echo $line|cut -d\: -f2
done < /path/to/file.csv
这会生成以下输出:
blala
blala
***.***.**.**
您也可以使用 while 循环来完成此操作,就我个人而言,我更喜欢这里的 for 循环。
循环在做什么?首先,循环读取 file.csv 的第一行并将其保存到变量“line”中。
在循环内,我们回显变量 $line 并将其切成和平。我们用分隔符(-d)“:”来剪切它,因为在你的 file.csv 中,标识符和值之间总是有一个“:”。使用字段指示符 (-f),我们只想显示字段 2 (-f2)。当 file.csv 不再有行时,for 循环结束。
有关更多信息,请参阅 cut(1) 的手册页。