使用 shell 脚本解析平面文件

使用 shell 脚本解析平面文件

我有一个如下格式的文件

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) 的手册页。

相关内容