8

我正在尝试从 bash 中的命令答案中提取带有 awk 的子字符串

示例输出行: abc_def_ghi jkl_lmn_opq

获得第二部分很容易

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'

但我只需要最后一部分子字符串“opq”并且没有找到让 awk 在字符串上运行两次的方法,当我将结果从上面传递给一个 var 并将这个 var 用于第二个 awk 时,我得到一个错误,因为string 是一个路径,因此是一个目录。同样,当在带有字符串的存储变量上使用时,sed 也没有遇到相同的错误,并且我没有设法将第一个子字符串传递给第二个 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}'

我怎样才能通过它来第二次剥离?

4

4 回答 4

8

这应该有效:

$ echo abc_def_ghi jkl_lmn_opq | awk -F_ '{ print $NF}'
opq

NF是存储字段数量的内置变量。当您拆分行_并告诉awk打印$NF时,您将打印最后一个字段。

但是,您可能并不总是需要字符串的最后一部分。在这种情况下,您可以substrawk.

使用相同的示例,您可以执行以下操作:

$ echo abc_def_ghi jkl_lmn_opq | awk ' { print substr($2,9) }'
opq

substr函数接受 3 个参数,第三个是可选的。第一个参数是有问题的字符串。第二个参数是起点,第三个(可选)参数是您要捕获的长度。如果您不提供它,则默认情况下它将捕获所有内容,直到字符串结束。

于 2013-06-05T05:44:24.653 回答
2

您还可以在 bash 中进行参数替换:

var="abc_def_ghi jkl_lmn_opq";
echo ${var##*_};

返回

opq
于 2013-06-05T05:52:13.580 回答
0
echo abc_def_ghi jkl_lmn_opq | grep -Po '[^_]+$'
于 2013-06-05T06:33:34.580 回答
0

这可能对您有用(GNU sed):

sed 's/.*_//' <<<"abc_def_ghi jkl_lmn_opq"
于 2013-06-05T08:35:07.947 回答