简单问题:我有一个变量叫x:
echo $x
3122;192.31.231.2 3379;183.3.202.111 3085;218.25.208.92
我只想迭代IP,而不是初始数字。
192.31.231.2
183.3.202.111
218.25.208.92
当前代码:
for ip in $x;
do
echo `geoiplookup "$ip[$2]"`
done
使用参数扩展的一个想法:
x="3122;192.31.231.2 3379;183.3.202.111 3085;218.25.208.92"
for stuff in ${x} # process each '<number>;ip' pair separately
do
ip="${stuff##*;}" # strip off leading '<number>;'
echo "${ip}"
# geoiplookup "${ip}"
done
注意:我不熟悉geoiplookup
命令,所以不确定为什么OP将geoiplookup
调用封装在echo
调用中,而只是直接调用geoiplookup
??
这将生成:
192.31.231.2
183.3.202.111
218.25.208.92
从这里,OP可以根据geoiplookup
调用的需要引用${ip}
。
如果我们可以假设,每个数字和IP地址之间是一个分号,那么我们只需要切换到分隔符(即本例中的;
(并选择第二部分。
我们可以这样做:echo $var | cut -d';' -f2
现在把这个放回你的代码:
for ip in $x; do
geoiplookup "$(echo $ip | cut -d';' -f2)"
# wrapping it in `echo` would just print what would be printed either way
done
使用这个Perl单行,通过管道连接到while
循环:
perl -lne 'print for /bd+;([d.]+)b/g' <<<$x |
while read -r ip ; do
echo "my_command ${ip}"
done
Perl单行使用以下命令行标志:-e
:neneneba告诉Perl在线查找代码,而不是在文件中查找代码-n
:一次循环输入一行,默认情况下将其分配给$_
-l
:在线执行代码之前,剥去输入行分隔符(默认为*NIX上的"n"
(,并在打印时附加。
/bd+;([d.]+)b/g
-捕获并返回IP地址。返回多个匹配项(regex/g
修饰符(。匹配b
(一个单词边界(,然后匹配d+;
(一段以分号结尾的数字(,再匹配[d.]+
(一段数字或句点(,然后是b
(另一个单词的边界(。