String 使用awk进行提取和拆分

String 使用awk进行提取和拆分,string,bash,sed,awk,strip,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用于第二个awk时,我得到一个错误,因为字符串是一个路径,因此是一个目录。我也并没有让sed在使用字符串存储的var时处理相同的错误,

我试图从bash中的命令应答中提取带有awk的子字符串

示例输出行:abc_def_ghi jkl_lmn_opq

获得第二部分很容易

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'
但是我只需要最后一部分的子字符串“opq”,没有找到让awk在字符串上运行两次的方法,当我将上面的结果传递给一个var并将这个var用于第二个awk时,我得到一个错误,因为字符串是一个路径,因此是一个目录。我也并没有让sed在使用字符串存储的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}'
如何将其传递到第二次剥离?

这应该可以:

$ echo abc_def_ghi jkl_lmn_opq | awk -F_ '{ print $NF}'
opq
NF
是存储字段数的内置变量。当您使用
\uu
拆分行并告诉
awk
打印
$NF
时,您将打印最后一个字段

但是,您可能并不总是需要字符串的最后一部分。在这种情况下,您可以使用
awk
中的
substr
函数

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

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

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

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

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

opq
这可能适用于您(GNU-sed):


sed的/*.//'很好,很简单!在这种情况下,使用
echo…|awk…
是一种过度杀伤力。echo只是为了测试输出,如果已经设置了一个var,这是一个非常简单的解决方案,在我的例子中,awk的输入是另一个函数的返回,使用var只是我的解决方法,因为没有将第一个剥离字符串传递给第二个awk-但对于现有的var,这是一种很酷的方法。(虽然我必须[并且会]阅读此解决方案才能理解:)再次感谢diggin深入介绍并提供压缩使用指南,我喜欢substr版本,但在这种特殊情况下,我并不总是舒尔的(因为从其他函数返回的字符串)字符串长度当我是舒尔时,它将始终是其他人现在需要的最后一部分。此解决方案中的第二(或其他)最后一个子字符串将是:
echo abc_def_ghi jkl_lmn|opq | awk-F|{print$(NF-1)}“
虽然我现在不知道如何从字符串的开头开始计数?@peet您可以始终使用
for循环
和do
for循环(i=1;我在没有弄好的情况下工作。s是分隔开关,第二个是分隔符,但为什么它返回最后一个子字符串而没有第三个参数-默认行为?@peet
*
意味着查找任何单个字符的零个或多个。由于regexp引擎贪婪,它将压缩到字符串的末尾。然后它必须回溯,直到找到一个字符为止
\uu
。因此,这会在字符串中找到最后一个
\u
,然后删除所有字符,最后一个
\u
留下所需的结果。请记住,字符串是从
abc
opq
的所有内容。感谢您的解释,我将使用什么来获取第二个最后一个子字符串?
echo abc_def_ghi jkl_lmn_opq | grep -Po '[^_]+$'
sed 's/.*_//' <<<"abc_def_ghi jkl_lmn_opq"