如何使用 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 ,}'
你不需要轻易使用awk, it can be done in bash。我假设 $SOMETHING
不包含 _
个字符(另外 CUSTOM
和 executable
部分只是一些文本,它们也不包含 _
)。那么:
k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k#*_}; l=${l#*_}; l=${l%.*};
这会删除从开头到第二个 _
个字符的所有内容,并删除最后一个 .
个字符之后的所有内容。结果放入 l
env.var.
如果 $SOMETHING
可能包含 _
则需要做一些工作(我假设 CUSTOM
和 executable
部分不包含 _
):
k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k%_*}; l=${l%_*}; l=${k#${l}_*}; l=${l%.*};
这将删除最后一个 _
字符之后的所有内容,从而从原始字符串中删除结果。最后一条语句切断了扩展名。结果在l
env.var.
或者可以使用 regex:
[[ $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:
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
| | | | || | | | | ||
我有一个字符串让我们说
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 ,}'
你不需要轻易使用awk, it can be done in bash。我假设 $SOMETHING
不包含 _
个字符(另外 CUSTOM
和 executable
部分只是一些文本,它们也不包含 _
)。那么:
k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k#*_}; l=${l#*_}; l=${l%.*};
这会删除从开头到第二个 _
个字符的所有内容,并删除最后一个 .
个字符之后的所有内容。结果放入 l
env.var.
如果 $SOMETHING
可能包含 _
则需要做一些工作(我假设 CUSTOM
和 executable
部分不包含 _
):
k=CHECK_${SOMETHING}_CUSTOM_executable.acs
l=${k%_*}; l=${l%_*}; l=${k#${l}_*}; l=${l%.*};
这将删除最后一个 _
字符之后的所有内容,从而从原始字符串中删除结果。最后一条语句切断了扩展名。结果在l
env.var.
或者可以使用 regex:
[[ $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:
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
| | | | || | | | | ||