我正在尝试从bash中的命令答案中使用awk提取子字符串
示例输出行: abc_def_ghi jkl_lmn_opq
获得第二部分很容易
echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'
但我只需要最后一部分子串" opq"并且没有找到让awk在字符串上运行两次的方法,当我将结果从上面传递给var并使用此var for second awk时我得到一个错误,因为字符串是一个路径,因此是一个目录。当我在使用字符串的存储var上使用时,我也没有使用相同的错误,我没有设法将第一个子字符串传递给第二个awk或sed。奇怪的?
如果不是第一个awk打印出来而不是传递到第二个awk
,这将完成工作echo abc_def_ghi jkl_lmn_opq | awk '{print $2}' | awk -F"_" '{print $3}'
既不适用
echo abc_def_ghi jkl_lmn_opq | awk '{$2}' | awk -F"_" '{print $3}'
我怎样才能将它传递到第二个剥离?
答案 0 :(得分:3)
这应该有效:
$ echo abc_def_ghi jkl_lmn_opq | awk -F_ '{ print $NF}'
opq
NF
是一个内置变量,用于存储字段数。当您使用_
拆分该行并告诉awk
打印$NF
时,您将打印最后一个字段。
但是,您可能并不总是需要字符串的最后部分。在这种情况下,您可以在substr
中使用awk
功能。
使用相同的例子,您可以:
$ echo abc_def_ghi jkl_lmn_opq | awk ' { print substr($2,9) }'
opq
substr
函数有3个参数,第三个是可选的。第一个参数是有问题的字符串。第二个参数是起点,第三个(可选)参数是您要捕获的长度。如果你不提供它,那么默认情况下它将捕获所有内容,直到字符串结束。
答案 1 :(得分:1)
您还可以在bash中进行参数替换:
var="abc_def_ghi jkl_lmn_opq";
echo ${var##*_};
返回
opq
答案 2 :(得分:0)
echo abc_def_ghi jkl_lmn_opq | grep -Po '[^_]+$'
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed 's/.*_//' <<<"abc_def_ghi jkl_lmn_opq"