用awk提取和分割

时间:2013-06-05 05:41:46

标签: string bash sed awk strip

我正在尝试从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}'

我怎样才能将它传递到第二个剥离?

4 个答案:

答案 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"