如何逃生鱼壳variables用作awk模式?
我正在写一个函数来列出来自给定docker库的最新图像:
function docker-latest set repo $argv[1] docker images | awk "/$repo/ && /latest/{print $1}" end
工作正常…
这是docker images
输出
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB coaxisopt_daemon v1.0.13 86bd3d602074 17 hours ago 830.7 MB docker.site.fr:5000/coaxis/coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB <none> <none> da0e5b0fc2a1 17 hours ago 830.7 MB docker.site.fr:5000/coaxis/coaxisopt_daemon <none> 9c0175d7d397 18 hours ago 830.7 MB …
这是我的预期输出:
$ docker-latest coaxis coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB docker.akema.fr:5000/coaxis/coaxisopt_daemon latest 86bd3d602074 17 hours ago 830.7 MB
直到
但是,当我在string的末尾放置一些/
(斜线)字符来过滤推送的图像时:
$ docker-latest coaxis/ awk: cmd. line:1: /coaxis// && /latest/{print } awk: cmd. line:1: ^ syntax error
题
我如何逃避repo
variables,所以我用awk
模式安全地使用它?
解
docker images | awk -v repo="$repo" '$1 ~ repo && $2 == "latest" {print $1}'
细节:诀窍是通过awk
的variablesrepo
传递$repo
repo
并转义$1
。
脏解决scheme
使用sed
:
echo "coaxis/" | sed 's!/!\\\/!g'
肮脏,因为它不是真正的通用。
全function
function docker-latest set repo (echo "$argv[1]" | sed 's!/!\\\/!g') docker images | awk "/$repo/ && /latest/{print $1}" end
如果你必须使用sed
,那么完全用sed
replaceawk
。 对于这种情况下,它会更清晰和更快(sed不总是这样)
sed
允许在s
命令之后将分隔符更改为任何内容。 我select了#
sed -n "s#\([^ ]*${repo}[^ ]*\) \+latest.*#\1#p"
-n
禁止输出, p
命令仅在匹配时打印。
(如果#
有问题,你可以select任何东西,比如%
,或者expression式中不太可能发生的事情)