bash脚本从字符串

时间:2016-08-08 13:24:25

标签: shell scripting

我需要根据长字符串中的某些值获取字符串的一部分(例如ps -ef的某些输出)。

例如源字符串:

long_string1="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."

long_string2="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc."

我想在 -DHOME = 之后提取或获取以下子字符串:

/home/user/xxx

" -DHOME = "的位置不是固定的,它可以在long_string中的任何地方。

我正在使用以下命令:

echo $long_string1|sed -e 's/.*-DHOME=//g;s/ -cccc=C.*//g'

它适用于$ long_string1,但它对$ long_string2不起作用。

仅当" -cccc = C " netx将是" -DHOME = " : - (

如何在" -DHOME = "之后获得路径?但不依赖于下一个值,例如"的 -cccc = C " ???

有没有更有效的方法或正则表达式来获得相同的输出?

由于 M.Gi

2 个答案:

答案 0 :(得分:1)

awkcut可以为您提供帮助。

#!/bin/bash
get_home() { awk -F "DHOME=" '{print $2}' <<< "${long_string}" | cut -d ' ' -f1; }

long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."
get_home
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc."
get_home
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx"
get_home

输出

/home/user/xxx
/home/user/xxx
/home/user/xxx

awk将输入拆分为“DHOME =”并打印第二部分 cut然后拆分空格并获得第一部分。显然,如果文件夹的名称包含空格,则无法正常工作。通常,主目录的名称中没有空格。

答案 1 :(得分:1)

纯粹bash风格的解决方案,为shelter提供建议。

#!/bin/bash

long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."

tempString1="${long_string##*-DHOME=}"  # Strips off everything upto '-DHOME='
tempString2="${tempString1/ *}"  # Strips off everything until first whitespace

echo "$tempString2"

在控制台中运行: -

$ ./myScript.sh
/home/user/xxx