对于循环,选择字符串变量的特定部分



简单问题:我有一个变量叫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(另一个单词的边界(。

最新更新