如何使用awk获取此子字符串?

时间:2015-01-20 13:59:31

标签: unix awk

我有一个字符串让我们说

k=CHECK_${SOMETHING}_CUSTOM_executable.acs

现在我想从上面的字符串中仅获取 CUSTOM_executable 。这是我迄今为止在Unix中尝试的方法

echo $k|awk -F '_' '{print $2}'

你能解释一下我该怎么做

5 个答案:

答案 0 :(得分:1)

试试这个:

$ echo "$k"
CHECK_111_CUSTOM_executable.acs

代码:

echo "$k" | awk 'BEGIN{FS=OFS="_"}{sub(/.acs/, "");print $3, $4}'

答案 1 :(得分:0)

为简单起见,假设变量${SOMETHING}的值为SOMETHING

以下分配

k=CHECK_${SOMETHING}_CUSTOM_executable.acs

k的值设置为CHECK_SOMETHING_CUSTOM_executable.acs

_分割到awk -F '_'上的字段时(请注意此处不需要单引号)。

您将获得以下字段:

$ echo "$k" | awk -F _ '{for (i=0; i<=NF; i++) {print i"="$i}}'
0=CHECK_SOMETHING_CUSTOM_executable.acs
1=CHECK
2=SOMETHING
3=CUSTOM
4=executable.acs

所以要获得你想要的输出只需使用

echo "$k" | awk -F _ -v OFS=_ '{print $3,$4}'

答案 2 :(得分:0)

您无需使用,可以在轻松完成。我假设$SOMETHING不包含_个字符(CUSTOMexecutable部分只是一些文字,它们也不包含_)。然后:

k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k#*_}; l=${l#*_}; l=${l%.*}; 

这会从开头到第二个_字符处剪切任何内容,并在最后一个.字符后删除任何内容。结果将放入l env.var。

如果$SOMETHING可能包含_,则必须完成一些工作(我假设CUSTOMexecutable部分不包含_) :

k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k%_*}; l=${l%_*}; l=${k#${l}_*}; l=${l%.*}; 

这会在最后一个_字符之后删除所有内容,从原始字符串中删除结果。最后一句话将关闭扩展名。结果在l env.var。

或者可以使用

完成
[[ $k =~ ([^_]+_[^_]+)\.[^.]+$ ]] && l=${BASH_REMATCH[1]}

这匹配任何包含两个以_分隔并以.<extension>结尾的字词的字符串。扩展部分被扼杀,结果在l env.var。

我希望这有帮助!

答案 3 :(得分:0)

假设SOMETHING变量有111_222_333(或)111_222_333_444

使用此:

$ k=CHECK_${SOMETHING}_CUSTOM_executable.acs

$ echo $k | awk 'BEGIN{FS=OFS="_"}{ print $(NF-1),$NF }'

(OR)

 echo $k | awk -F_ '{ print $(NF-1), $NF }' OFS=_

说明:

NF - 当前输入记录中的字段数。

答案 4 :(得分:0)

试试这个简单的

awk -F[._] '{print $3"_"$4}' <<<"$k"

CUSTOM_executable

-F[._]将点和下划线定义为字段分隔符。然后awk打印来自$k的第3和第4个字段作为输入。

如果k包含k='CHECK_${111_111}_CUSTOM_executable.acs',则使用带有数字$ 4和$ 5的文件:

awk -F[._] '{print $4"_"$5}' <<<"$k"
CHECK_${111_111}_CUSTOM_executable.acs
| $1| |$2 | |$3| | $4 | |   $5   | |$6|