如何在Bash中剪切以下字符串并检索“未运行”状态。我尝试了cut命令
示例:
cut -d“STATUS”
,但它抛出异常。示例:
$ echo "NAME(APACHE) STATUS(Not Running)
期望的字符串:
Not Running
使用 bash
的正则表达式运算符 ~
string="NAME(APACHE) STATUS(Not Running)"
[[ $string =~ ^.*STATUS\((.*)\)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}"
Not Running
使用 Awk
作为 ()
分隔符,
echo "NAME(APACHE) STATUS(Not Running)" | awk 'BEGIN{FS="[()]"}{print $4}'
Not Running
由于bash不支持嵌套参数扩展,因此可以使用双重折叠参数替换。
temp1="${string#*)}"
temp2="${temp1%*)}"
printf "%s\n" "${temp2#*STATUS(}"
Not Running
使用带有PCRE - Perl兼容正则表达式功能的GNU grep
,并加上-P
标志:
grep -oP '.*STATUS\(\K[^\)]+' <<<"$string"
Not Running
替代方案:
使用sed
命令:
echo "NAME(APACHE) STATUS(Not Running)" | sed -rn 's/.*\(([^)]+)\)$/\1/p'
使用 perl
实现:
echo "NAME(APACHE) STATUS(Not Running)" | perl -lne 'print $1 if /\(([^)]+)\)$/'
使用 awk
命令(将大括号 ) (
视为字段分隔符 FS
):
echo "NAME(APACHE) STATUS(Not Running)" | awk 'BEGIN{FS="[)(]"}{ print $(NF-1) }'
$(NF-1)
- 指向最后一个非空字段
\(([^)]+)\)$/
- 正则表达式模式,将匹配字符串末尾花括号中的字符序列
\1
(在sed
表达式中)和 $1
(在perl
表达式中)指向第一个捕获组(...)
命令cut -d
只能使用单个字符作为分隔符,这就是为什么你不能使用"STATUS"作为分隔符的原因。
你可以使用awk或使用另一个分隔符(例如"(")来代替cut。
echo "NAME(APACHE) STATUS(Not Running)" | cut -d'(' -f3
将会输出:
Not Running)
tr
移除最后一个")":echo "NAME(APACHE) STATUS(Not Running)" | cut -d'(' -f3 | tr -d ')'
grep
和tr
:
echo "NAME(APACHE) STATUS(Not Running)" | grep -o '([^)]\+)$' | tr -d '()'
([^)]\+)$
匹配行末括号中的任何内容。
tr
命令删除了括号。