另请参阅:字符串操作 - 在某个单词之后获取部分
我的脚本:
# get list of curent possible F2B 'get' options, as a array (omitting the 'action..') ..
f2b_opts_cmd="$(sudo fail2ban-client --help | grep -i 'get <jail>' | grep -vw 'act')"
f2b_opts="$(sed -e "s/get\s<JAIL>\s\([^ ]*\).*/\1/" $f2b_opts_cmd | tr '\n' ' ')"
echo $f2b_opts`
我究竟做错了什么?这段代码只给了我一个完整的“sed: can't read ..”行列表??
顺便说一句,如果我使用管道结构:f2b_opts_cmd="$(sudo fail2ban-client --help | grep -i 'get <jail>' | grep -vw 'act' | sed -e "s/get\s<JAIL>\s\([^ ]*\).*/\1/" | tr '\n' ' ')"
它包括我认为被过滤掉的“动作”行?(在 cmdline 上执行时,它不包括那些“Action”行)
编辑:只需阅读您之前的问题。其中提到了数组变量。作为
f2b_opts_cmd
字符串变量和f2b_opts
bash 数组:为什么以下不起作用:
$f2b_opts_cmd
提供sed
要读取的文件列表。相反,将参数扩展的结果定向到 的标准输入sed
:bash
为上述<<
here-doc重定向提供了一个更简洁的替代方案,称为here-string:grep -vw 'act'
不起作用,因为您要过滤掉的行是大写字母 (<ACT>
)。用于-i
忽略大小写,或指定具有适当大小写的模式grep -vw 'ACT'
grep
别名为grep -i
sudo
查看--help
输出$
`
\
)——在单引号'
中只需要处理文字tr
是不必要的。当bash
扩展一个未引用的替换时,它会根据 shell 变量的值将结果拆分为单独的单词IFS
(详见手册)... | grep | grep | sed
通常可以由单个sed
或awk
脚本替换。sed
从提供的原始脚本向后工作:awk
似乎更容易使用: