我正在尝试编写一个别名来获取 docker 容器的 IP。命令如下:
docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'
如果我从命令行启动它,它可以正常工作。然后我将其插入bash_aliases
:
alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'"
但是当我启动时,redis-ip
我收到此错误:
sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS
任何人都可以告诉我错误是什么?
答案1
为此,请使用 shell 函数而不是别名:
function redis-ip {
docker inspect redis |
grep IPAddress |
awk 'NR == 3 { print $2 }' |
sed 's/[^"]*"\([^"]*\)".*/\1/'
}
如果它sed
符合您的要求,我不知道,因为我不知道该docker
命令输出什么。
答案2
问题是您的别名用双引号 ( "
) 括起来。这意味着脚本$2
中的awk
被传递到 shell,而不是传递到 shell awk
,并且命令中的双引号sed
会搞乱您的别名。如果您这样做,您的别名应该按预期工作:
alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{print \$2 }' | sed 's/[^\"]*\"\([^\"]*\)\".*/\1/'"
可能更好而且更简单使用函数尽管。
答案3
通常,我会说“如果你想从 json 解析或提取数据,请使用 jq 或 jsonpipe 或类似的”,但该docker inspect
命令已经具有内置的输出格式和字段提取。
您可以告诉docker inspect
只返回您感兴趣的字段,例如
alias redis-ip="docker inspect -f '{{.NetworkSettings.IPAddress}}' redis"
或者
alias redis-ip='docker inspect -f '\''{{.NetworkSettings.IPAddress}}'\'' redis'
这是(简洁地)记录在https://docs.docker.com/engine/reference/commandline/inspect/
也可以看看检查时要检查什么了解更多详细信息和示例。和Docker 检查模板魔法是另一篇博客文章,很好地概述了 docker 检查输出格式的可能性,以及几个更有用的示例。