【问题标题】:Unable to print multiple columns无法打印多列
【发布时间】:2019-07-08 12:06:33
【问题描述】:

我正在尝试使用下面的命令打印出多个列,但它不起作用。 有人可以检查我缺少什么。

grep -i "$(echo ${vdisk}| awk '{print $1,$2}' 2>/dev/null)" ${GBL_TEMP}/vdisk_*

使用上面的命令,它将打印所有内容,并且不会解析 $1 和 $2

所以我尝试了这个

grep -i "$(echo ${vdisk}| awk '{print $1,$2,$4,$5,$7,$8,$10}' 2>/dev/null)" ${GBL_TEMP}/vdisk_*

但还是没有运气。

我正在尝试打印这些列{print $1,$2,$4,$5,$7,$8,$10}

$vdisk 的输出

745 ptr3p_002       0           io_grp0       online 16           B1_DID_T1N_ABG1 11.00GB  striped               745   ptr3p_002       60050768019181B398000000000004DF 0            1          not_empty        0             no        0                     16                  B1_DID_T1N_ABG1       no         no      745       ptr3p_002       master

【问题讨论】:

  • 发布echo ${vdisk}的输出
  • @RomanPerekhrest,将其添加到我的帖子中。
  • 我认为你不应该在你的 awk 中添加列,这会改变匹配标准,而应该将grep(一个完整的行)的输出通过管道传输到另一个awk(或@ 987654328@) 将提取您想要的列。目前我猜你的命令没有输出任何东西,因为文件不包含你的变量的第 1、2、4、5、7、8 和 10 列相邻的行(这是你的 awk 的输出-> grep的匹配条件)
  • @Aaron,我尝试使用 grep 然后 > 到一个文件。但是,$vdisk 包含多个要在${GBL_TEMP}/vdisk_* 中搜索的字符串。不幸的是,我不知道为什么,只有 1 个输出被重定向。
  • 您的awk 命令输出745 ptr3p_002 io_grp0 online B1_DID_T1N_ABG1 11.00GB 745。该字符串是您要在 ${GBL_TEMP}/vdisk_* 文件中搜索的内容吗?

标签: bash shell unix scripting


【解决方案1】:

如果您不确定 32 个字符的字符串将位于哪一列,您可以使用以下方法来测试每个变量的字符串长度。仅当它始终为 32 个字符时:

文件vdisk的3个变种:

文件 vdisk1 有 32 个字符串为 $10

745 ptr3p_002 0 io_grp0 online 16 B1_DID_T1N_ABG1 11.00GB striped 745 1 60050768019181B398000000000004DF 0 1 not_empty 0 no 0 16 B1_DID_T1N_ABG1 no no 745 ptr3p_002 master

文件 vdisk2 有 32 个字符串为 $11

745 ptr3p_002 0 io_grp0 online 16 B1_DID_T1N_ABG1 11.00GB striped 1 1 60050768019181B398000000000004DF 0 1 not_empty 0 no 0 16 B1_DID_T1N_ABG1 no no 745 ptr3p_002 master

文件 vdisk3 有 32 个字符串 $12

745 ptr3p_002 0 io_grp0 online 16 B1_DID_T1N_ABG1 11.00GB striped 745 ptr3p_002 60050768019181B398000000000004DF 0 1 not_empty 0 no 0 16 B1_DID_T1N_ABG1 no no 745 ptr3p_002 master

它很粗糙,但很有效:

#!/bin/bash
for each in vdisk*
do
    var10=$(awk '{print $10}' $each)
    var11=$(awk '{print $11}' $each)
    var12=$(awk '{print $12}' $each)

for i in $var10 $var11 $var12
    do
    check=${#i}
    if [ $check -eq 32 ]; then
    char32=$i
    fi
done

awkout=$(awk '{print $1, $2, $4, $5, $7, $8}' $each)

echo  "$awkout $char32" | xargs

done

所有文件的输出:

745 ptr3p_002 io_grp0 online B1_DID_T1N_ABG1 11.00GB 60050768019181B398000000000004DF
745 ptr3p_002 io_grp0 online B1_DID_T1N_ABG1 11.00GB 60050768019181B398000000000004DF
745 ptr3p_002 io_grp0 online B1_DID_T1N_ABG1 11.00GB 60050768019181B398000000000004DF

【讨论】:

  • $vdisk 也是列 $10 由这 32 位数字组成 --> 60050768019181B398000000000004DF.. 即使我尝试执行此命令 awk -F, '{print $1, $2, $4, $5, $7, $8; $10}' vdisk_*,我也不知道为什么该列没有打印出来。 :(
  • 您的 vdisk 示例中没有逗号,因此不能是作为输入字段分隔符的 -F
  • opps.. 抱歉添加了新的虚拟磁盘结果。无论如何,即使我将其删除,这 32 位数字也不会打印出来。顺便说一下,这是来自存储的 LUN ID。不确定你是否熟悉。不知道这是否被认为是 ascii,但如果是,你知道我如何按原样打印出来吗?
  • 使用您的示例虚拟磁盘,32 个字符的字符串为 $12。
  • 好的,我想我知道问题出在哪里。那 32 个字符的字符串不只是在 $10 列中。它的位置发生了变化。它可以在 $10、$11 或 $12 列中。现在,问题是。在这种情况下,我如何包含这些字符串?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2023-03-16
  • 1970-01-01
  • 2021-05-25
  • 2019-10-11
相关资源
最近更新 更多