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

How do I fetch this substring using awk?

我有一个字符串让我们说

k=CHECK_${SOMETHING}_CUSTOM_executable.acs

现在我只想从上面的字符串中获取 CUSTOM_executable。这是我到目前为止在 Unix

中尝试过的
echo $k|awk -F '_' '{print }'

你能解释一下我该怎么做吗

试试这个:

$ echo "$k"
CHECK_111_CUSTOM_executable.acs

代码:

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

为简单起见,假设变量 ${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 ,}'

你不需要轻易使用, it can be done in 。我假设 $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%.*}; 

这将删除最后一个 _ 字符之后的所有内容,从而从原始字符串中删除结果。最后一条语句切断了扩展名。结果在lenv.var.

或者可以使用 :

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

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

希望对您有所帮助!

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

使用这个:

$ k=CHECK_${SOMETHING}_CUSTOM_executable.acs

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

(或)

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

解释:

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

试试这个简单的 :

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

CUSTOM_executable

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

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

awk -F[._] '{print "_"}' <<<"$k"
CHECK_${111_111}_CUSTOM_executable.acs
| | | | || |  | |      | ||