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

时间:2017-03-02 09:30:55

标签: bash shell awk sed

如何剪切以下字符串并在Bash中检索“未运行”状态。 我试过cut命令cut -d"STATUS",它正在抛出异常

EX:

$ echo "NAME(APACHE) STATUS(Not Running)

预期字符串:

Not Running

4 个答案:

答案 0 :(得分: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

使用GNU grep及其PCRE - Perl Compatible Regular Expressions功能,-P标记,

grep -oP '.*STATUS\(\K[^\)]+' <<<"$string"
Not Running

答案 1 :(得分: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表达式内)指向第一个捕获的组(...)

答案 2 :(得分:1)

命令cut -d仅适用于单字符分隔符,这就是为什么你不能使用&#34; STATUS&#34;作为分隔符。

您可以改用awk,或者使用另一个分隔符剪切,例如&#34;(&#34;:

echo "NAME(APACHE) STATUS(Not Running)"  | cut -d'(' -f3

这将给出输出:

Not Running)

然后你可以删除最后一个&#34;)&#34;与tr

echo "NAME(APACHE) STATUS(Not Running)"  | cut -d'(' -f3 | tr -d ')'

答案 3 :(得分:1)

使用<Button android:text="@null" android:stateListAnimator="@null" android:layout_width="50dp" android:layout_height="50dp" android:id="@+id/colorButton" android:background="@drawable/button_border" /> grep的另一种方式:

tr

正则表达式echo "NAME(APACHE) STATUS(Not Running)" | grep -o '([^)]\+)$' | tr -d '()' 匹配行尾的括号之间的任何内容。

([^)]\+)$命令正在删除括号。