Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grep和RegEx在Docker容器中?_Docker_Grep - Fatal编程技术网

Grep和RegEx在Docker容器中?

Grep和RegEx在Docker容器中?,docker,grep,Docker,Grep,我第一次接触Bash编码(也不是Linux方面最有经验的人),我正在尝试从容器中的version.php读取该版本: /config/www/nextcloud/version.php 为此,我运行: docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\

我第一次接触Bash编码(也不是Linux方面最有经验的人),我正在尝试从容器中的
version.php
读取该版本:

/config/www/nextcloud/version.php

为此,我运行:

docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php
这使用了一个语义版本控制正则表达式模式(我知道,有点过分了,但它现在可以工作)来读取和提取行中的版本:

$OC_VersionString='20.0.1'

但是,当我运行命令时,它告诉我
没有这样的文件或目录(我已经确认它确实存在于容器中的该路径),然后继续吐出它刚才说的不存在的文件的全部内容

grep:(0 |[1-9]\d*)(0 |[1-9]\d*)(0 |[1-9]\d*)(?:-(?:0 |[1-9]\d*.\d*[a-zA-Z-][0-9a-zA-Z-])(?:(?:(?:0 |[1-9]\d |\d*[a-zA-Z-][0-9a-zA-Z-]))))(?:[0-9a-zA-])Z-] /config/www/nextcloud/version.php:$OC_version=array(20,0,1,1); /config/www/nextcloud/version.php:$OC_VersionString='20.0.1'; /config/www/nextcloud/version.php:$OC_Edition=''; /config/www/nextcloud/version.php:$OC_VersionCanBeUpgradedFrom=array( /config/www/nextcloud/version.php:'nextcloud'=> /config/www/nextcloud/version.php:'owncloud'=> /config/www/nextcloud/version.php:$vendor='nextcloud'

有人能发现问题吗

更新1:

docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php
为了清楚起见,我试图从一个bash脚本中运行它。我只想从该文件中获取版本号,以便在脚本的其他区域使用它

更新2:

docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php
回应这些评论,我尝试先登录到容器,然后运行grep,但仍然得到相同的结果。然后我对该文件进行了cat,结果显示它的内容没有问题


许多容器没有Unix工具的GNU版本及其各种扩展。流行的做法是将容器基于Alpine Linux,而后者又使用一种称为BusyBox的非常轻量级的单一二进制工具来提供基本工具。这些工具往往具有POSIX规范所需的一组选项,仅此而已

特别是POSIX没有
-o
选项,因此您运行的命令是

grep\
-eo \#指定“o”作为要匹配的regexp
“(regexp仅为写)”文件名
/config/www/nextcloud/version.php#第二个文件名
请注意,交互式shell中的
grep
输出仅包含带有字母“o”的行,而不是仅包含
数组的行

POSIX grep没有GNU grep的等价物

仅打印匹配行的匹配(非空)部分,每个匹配部分位于单独的输出行上。输出行使用与输入相同的分隔符

但是使用sed(1)很容易做到这一点。让它匹配一些内容、有问题的regexp和一些内容,并用匹配的组替换它

sed-e的/*\(此处的任何regexp\)./\1/'输入文件

(POSIX只接受基本的正则表达式,因此您必须避开更多的括号。)

好吧,对于任何未来的潜在读者来说,我没有运气让
grep
来做这件事,我确信不知何故这是我的错,而不是grep的错,但多亏了帮助,我能够使用
awk
而不是
grep
,就像这样:

docker exec -it 1c8c05daba19 awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){print substr($0,RSTART+1,RLENGTH-2)}' /config/www/nextcloud/version.php
这正是我所需要的:

docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php
  • 它登录到docker容器中
  • 扫描并返回我要查找的行中的版本号:
    /config/www/nextcloud/version.php
  • 从容器中退出舞台左侧,只包含我需要的信息
  • 我可以马上回去吃我的热奇多

docker exec-it命令用于登录到容器,一旦登录,您就可以grep。因此,首先登录到容器docker exec-it 1c8c05daba19,然后用regexphmm搜索,登录到容器,检查文件是否存在,登录后试着运行bash,检查它是否工作正常。99%您可能犯了一个简单的错误谢谢@David Maze,在阅读您的帖子之前,我还想检查一下容器中的grep版本,并做了一个快速的
grep--help
。您是对的,它使用了一个精简的busybox版本,看起来还需要一个
-f
参数作为文件名,但奇怪的是,它仍然有
-o
argument.我仍然无法让它工作,所以我会给你的sed建议一次机会。这看起来对吗?
sed-e的/*\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\).*/\1/'/config/www/nextcloud/version.php
。尝试一个不同的正则表达式,但当我使用它时,它只是回显文件的全部内容。使用更多转义字符得到相同的结果:
sed-e's/*\([0-9]\{1,2\\\\\\+[.]\+\([0-9]\{1,2\\\\)\+[.[.]+++.[.[.[.[.[.[.[.]\[.[.[.[.[.9]\[.1,2\\\\\\]./\1/'/www/nexoud/version.php>