我有一个字符串让我们说
k=CHECK_${SOMETHING}_CUSTOM_executable.acs
现在我想从上面的字符串中仅获取 CUSTOM_executable 。这是我迄今为止在Unix中尝试的方法
echo $k|awk -F '_' '{print $2}'
你能解释一下我该怎么做
答案 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)
您无需使用awk,可以在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。
我希望这有帮助!
答案 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:
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|