首页 > 解决方案 > ksh 中的数组和分隔符

问题描述

我的命令的结果是:

> htnnpjhuhj.jbjbnljnkn:tcp:ssh xxx.12234.r444:44056  
> ftpddddddd.jbfffdnkn:tcp:ssh xxx.122555.r674:44067

我试图在分隔符“:”之前只获取每行中的第一个元素,也就是说,我正在尝试获取htnnpjhuhj.jbjbnljnknand ftpddddddd.jbfffdnkn。请告诉我下面的代码有什么问题。

function myfunc 
{    
   command=$(command)
   IFS=":" read -rA RESULTS <<< $command
   echo ${RESULTS[0]}

}

标签: arrayskshdelimiter

解决方案


假设所需的输出如下所示:

htnnpjhuhj.jbjbnljnkn
ftpddddddd.jbfffdnkn

有几种方法可以完成这个...... cut,, ......问题sedawk提到的基于数组的解决方案。

目前尚不清楚(对我而言)该功能将如何使用,所以我将更直接地看一些东西。

这是一个awk基于两个可能的分隔符(space:)之一解析输入的解决方案:

$ cat rawdata
> htnnpjhuhj.jbjbnljnkn:tcp:ssh xxx.12234.r444:44056
> ftpddddddd.jbfffdnkn:tcp:ssh xxx.122555.r674:44067

$ awk -F"[ :]" '{print $2}' rawdata
htnnpjhuhj.jbjbnljnkn
ftpddddddd.jbfffdnkn

如果打算将所有值放在一行上,那么我们可以在awk代码中添加更多内容,如下所示:

$ awk -F"[ :]" '{printf $2" "} END {printf "\n"}' rawdata
htnnpjhuhj.jbjbnljnkn ftpddddddd.jbfffdnkn

注意:这确实在输出的末尾放置了一个额外的空间。

同样,有很多方法可以对此进行切片,但我们需要来自 OP 的更多详细信息,以了解所需的输出以及以后是否/如何使用输出。


推荐阅读