我是bash的新手,我正在尝试编写一个脚本来对LXC主机进行维护,它是你可以在github project找到的容器。 目前我正在尝试将容器的名称分成两个数组:$ active_containers和$ inactive_containers。我构建的正则表达式基于以下内容:
这需要所有容器名称:
- 长度在1到63个字符之间 - 仅由字母数字字符和连字符组成 - 不要以数字字符或连字符开头 - 不以连字符结尾
我知道我的正则表达尚不完美,它现在寻找3-63个字符。
我的test.sh:
#!/bin/bashbased
active_containers="$(lxc list -c ns | grep RUNNING)"
echo $active_containers
findcontainers='\b(a-zA-Z{1}a-zA-Z0-9\-{,61}a-zA-Z0-9{1})\b'
echo $active_containers | sed -e $findcontainers
echo "Containers found: $active_containers"
FYI:命令“lxc list -c ns”的输出:
+-------------+---------+
| NAME | STATE |
+-------------+---------+
| linuxserver | RUNNING |
+-------------+---------+
| websites | RUNNING |
+-------------+---------+
目前的结果:
| linuxserver | RUNNING | | websites | RUNNING |
sed: -e expression #1, char 37: unterminated address regex
我想得到的结果:
$active_containers(0): "linuxserver"
$active_containers(1): "RUNNING"
$active_containers(2): "websites"
$active_containers(3): "RUNNING"
我一直在搜索(e)grep,sed和awk的stackoverflow和手册,但找不到我做错了什么..
如果我提出重复的问题,我的谦卑道歉
编辑:
如果有人能告诉我我的问题值得一个-1,我会非常感激。我不知道该修复/改进...
答案 0 :(得分:0)
findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]*$'
echo "$active_containers" | grep "$findcontainers"
匹配3到63个字符,并且在第一个或最后一个位置没有连字符,具体取决于grep版本{
必须转义或不具有特殊含义。
findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]\{1,61\}[a-zA-Z0-9]$'
echo "$active_containers" | grep "$findcontainers"
否则使用gnu grep和PCRE(-P
perl regex)
findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9]$'
echo "$active_containers" | grep -P "$findcontainers"
给定lxc输出,模式名称可能匹配,因为已经过滤的RUNNING
可能会有以下帮助:
echo "$active_containers" | grep -Po "\b[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9](?=\s*\| RUNNING)"
当作为参数传递给命令时,变量必须用双引号括起来,以避免分词(分成多个参数)。
过滤匹配的工具是grep
,sed
是替换。
^
行首播匹配空字符串 [
.. ]
是字符集,-
位于第一个位置或最后添加连字符-
以设置否则定义一系列字符
*
表示0次或更多次出现
$
行结束符合空字符串