如何在Bash中使用多个分隔符对字符串进行分割

6
我该如何在bash中使用多个字符作为分隔符来分割字符串。我想要获取第一个IP地址。
inet addr:127.0.0.1  Mask:255.0.0.0

我会这样做

echo "inet addr:127.0.0.1  Mask:255.0.0.0" | cut -d' ' -f2 | cut -d':' -f1 

但我希望将最后两个命令合并为一个。

我想要得到

127.0.0.1


1
请编辑您的问题,包括样例输入所需的输出。祝你好运。 - shellter
2个回答

4

使用 awk,将字段分隔符设置为一个或多个空格/制表符或 :,然后获取第三个字段:

awk -F '[[:blank:]:]+' '{print $3}'

请注意,这将获取所提到的字段分隔符分隔的第三个字段,该字段可能是有效的IP地址,也可能不是;从您使用 cut 的尝试中,我假设输入是一致的。
示例:
% awk -F '[[:blank:]:]+' '{print $3}'  <<<'inet addr:127.0.0.1  Mask:255.0.0.0'
127.0.0.1

谢谢,就是这样!我之前不知道什么是空格,现在我知道它是[:blank:]了。 - richard_d_sim
请注意,这仅适用于GNU awk,而不是其他awk。对于其他awk,您可以使用以下命令:awk '{sub(/^[^:]+:/,""); print $1}' 或者将其他分隔符替换为第一个分隔符:awk '{gsub(/:/," "); print $3}' - James Brown

2

将IFS设置为分隔符:

echo inet addr:127.0.0.1  Mask:255.0.0.0 | 
   { IFS=': ' read i a ip m e; echo $ip; }

这将把变量i设置为字符串ineta<-addrip<-127.0.0.1m<-Maske<-255.0.0.0。请注意,在许多Shell中,变量的作用域仅限于括号内,并且将在括号外失去其值。有一些技术可用于在合理限制其范围的Shell中赋予它们全局作用域,例如:

IFS=': ' read i a ip m e << EOF
inet addr:127.0.0.1  Mask:255.0.0.0
EOF
echo $ip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接