我有用于SNMP walk设备的Perl脚本。但是,我可以使用的服务器不允许我安装所需的所有模块。所以我需要将脚本转换为Shell(sh)。我可以在各个设备上运行脚本,但希望它能像在Perl中那样从文本中读取。 Perl脚本以:
开头 open(TEST, "cat test.txt |");
@records=<TEST>;
close(TEST);
foreach $line (@records)
{
($field1, $field2, $field3)=split(/\s+/, $line);
# Run and record SNMP walk results.
答案 0 :(得分:2)
根据输入的确切内容以及您尝试执行的操作,perl代码片段可能会转换为:
while read field1 field2 field3
do
# Run and record SNMP walk results.
echo "1=$field1 2=$field2 3=$field3"
done <text.txt
例如,如果text.txt
是:
$ cat text.txt
one two three
i ii iii
然后,上面的代码产生输出:
1=one 2=two 3=three
1=i 2=ii 3=iii
正如您所看到的,shell read
命令一次读取一行(记录),并且还在空格上进行拆分。 read
有很多选项来控制换行符或其他内容是否划分记录(-d
)以及是否要在空格或其他内容(IFS
)上进行拆分或是否在输入是否被视为转义字符(-r
)。请参阅man bash
。
答案 1 :(得分:0)
while read string; do
str1=${string%% *}
str3=${string##* }
temp=${string#$str1 }
str2=${temp%% *}
echo $str1 $str2 $str3
done <test.txt
备用版
while read string; do
str1=${string%% *}
temp=${string#$str1 }
str2=${temp%% *}
temp=${string#$str1 $str2 }
str3=${temp%% *}
echo $str1 $str2 $str3
done <test.txt
POSIX substring parameter expansion
$ {参数%字}
删除最小的后缀模式。这个词应该扩展到产生 一种模式。然后参数扩展将产生参数, 后缀的最小部分与模式匹配 删除。
$ {参数%%字}
删除最大的后缀模式。这个词应该扩展为产生一个 图案。然后参数扩展将产生参数 后缀的最大部分与删除的模式匹配。
$ {参数#字}
删除最小的前缀模式。这个词应该扩展到产生 一种模式。然后参数扩展将产生参数, 前缀的最小部分与模式匹配 删除。 $ {parameter ## word}删除最大的前缀模式。这个单词 应扩大以产生一种模式。参数扩展应 然后导致参数,具有前缀的最大部分 与删除的模式匹配。
$ {参数##字}
删除最大的前缀模式。这个词应该扩展为产生一个 图案。然后参数扩展将产生参数 前缀的最大部分与删除的模式匹配。