如何使用Bash命令剪切字符串

3
如何在Bash中剪切以下字符串并检索“未运行”状态。我尝试了cut命令cut -d“STATUS”,但它抛出异常。
示例:
$ echo "NAME(APACHE) STATUS(Not Running)

期望的字符串:

Not Running
4个回答

4

使用 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

2

替代方案:

使用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表达式中)指向第一个捕获组(...)


1

命令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 ')'

1
另一种方法是使用greptr

echo "NAME(APACHE) STATUS(Not Running)" | grep -o '([^)]\+)$' | tr -d '()'

正则表达式([^)]\+)$匹配行末括号中的任何内容。 tr命令删除了括号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接