剪切第二列的命令问题

cut command issue with 2nd column

我正在尝试从字符串中删除某些值。它在第一列中按预期工作,但是当我尝试在第二列中时,它没有给出所需的输出。

代码与输出

[psatav]$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'
[psatav]$ echo '$$JOB_ESTD_TIME2'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2
 '2016-04-16 20:00:00'

第二个命令应该 return :-

$$JOB_ESTD_TIME2='2016-04-16 20:00:00'

您正在将 cut 的分隔符设置为 |,因此 -f1 会剪切第一个 | 之前的所有内容并打印所需的输出。

但是 -f2 会截断第一个和第二个 | 之间的数据,这就是你得到的。

您可以使用以下 awk 命令来获得所需的输出:

bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{
split(,a,"|"); print ,"=",a[1]}'
$$JOB_ESTD_TIME1 = '2016-04-16 00:00:00' 
bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{
split(,a,"|"); print ,"=",a[2]}'
$$JOB_ESTD_TIME1 =  '2016-04-16 20:00:00'
  • -F"=" 参数将分隔符设置为 =,因此 </code> 将包含 <code>$$JOB_ESTD_TIME1
  • split 函数拆分 </code> (这是其余的 <code>=) 之后的数据并将其存储在数组 a.
  • print 打印 数组中的必填字段。

您的 OP 中的 cut 命令不会那样工作,您可以像这样将 awkmultiple delimiters 一起使用:-

awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'
awk -F'[=|]' '{gsub(/ /, "", ); printf "%s=%s\n", , }'

对于你的情况,

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", );printf "%s=%s\n", ,  }'
$$JOB_ESTD_TIME1='2016-04-16 00:00:00'

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", );printf "%s=%s\n", ,  }'
$$JOB_ESTD_TIME1='2016-04-16 20:00:00'

在将每个字段传递给 printf 之前使用 gsub 删除空格。

您正在做的是将 $$JOB_ESTD_TIME1='2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00' 整个字符串传递给剪切,因此对于 f1 它会剪切

$$JOB_ESTD_TIME1='2016-04-16 00:00:00'

并且对于 f2 它只削减 '2016-04-16 20:00:00'

如果你不想使用 awk 并坚持 cut 这里是你应该做的

echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2)
$$JOB_ESTD_TIME2= '2016-04-16 20:00:00'

echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1)
$$JOB_ESTD_TIME2='2016-04-16 00:00:00'