BASH:需要从命令获取输出,将第n列存储在变量中,然后解析它

时间:2015-07-08 17:25:41

标签: bash

我需要解析命令输出的第n列 - 这个输出保证是某种类型的表,具有未定义的长度和宽度。这个表还有一个我想忽略的标题。我想通过将所需的列存储在变量中然后解析它来实现这一点。

此外,如果我想做同样的事情,但只解析包含某种模式的值,我该怎么做?我必须pipe上面命令的输出grep,然后将其输出存储到我解析的数组中。

示例输入和输出

~$ myCommand <args>
TABLE HEADER: <Some explanation of what the table means>
first_cola second_cola third_cola fourth_cola ...
first_colb second_colb third_colb fourth_colb ...
first_colc second_colc third_colc fourth_colc ...
...        ...         ...        ...    

这里&#34; first_cola&#34;等是字符串。所以我需要,例如,遍历所有&#34; first_col&#34;值,也许只看具有某种模式的那些。

澄清: 用户通过输入从1到表中列数的数字来选择要查看的,之后,可以选择从先前选择的列中选择一些值 < / em>仅选择与特定模式匹配的值。这些值应该保存到一个我将迭代的数组中。然后对所选值执行的操作与此问题无关。

2 个答案:

答案 0 :(得分:1)

egrep '2$' < <(echo -e 'ha hb hc\na1 b1 c1\na2 b2 c2' | tail -n+2 | cut -d' ' -f2)

  • echo -e 'ha hb hc\na1 b1 c1\na2 b2 c2'打印样本3x3网格
  • tail -n+2删除第一行标题
  • cut -d' ' -f2正在使用空格作为分隔符
  • 来剪切第二列
  • egrep '2$' < <(xxx)在命令2
  • 的输出中搜索以xxx结尾的字符串

答案 1 :(得分:1)

如果您定义要跳过的行数(通常为0或1)和所需的列,则可以使用以下内容获取未过滤的输出:

myCommand '<args>' |
awk -v skip=1 -v column=4 'NR <= skip { next } { print $column }'

如果您也要过滤,可以在grep命令后添加awk,也可以awk进行过滤:

myCommand '<args>' |
awk -v skip=1 -v column=4 filter='[a-z]$' \
    'NR <= skip { next } { if ($column ~ filter) print $column }'

过滤第4列(仅限)以小写字母字符结尾的值。您可以通过将if条件更改为($0 ~ filter)来过滤整行。

通过更多工作(相当多的工作),您可以安排打印多列。您可以安排在一个灵活的脚本中处理所有这些(我有一个,但它也不支持正则表达式过滤)。

标准cut命令对于列之间的多个分隔符不灵活,与awk不同。有时这是一个优势;有时这是一个缺点。

  

你能解释'NR <= skip { next } { print $column }'的作用吗?

NR <= skip { next }部分将当前记录编号NR与变量skip中的值进行比较;如果当前记录号小于或等于要跳过的号码,则它会执行next,这意味着跳到下一个输入记录(不要在脚本中执行任何操作)。

{ print $column }部分有一个空模式(或条件),所以它始终是&#39;执行。它打印变量column中的数字指定的列中的数据。

变量skipcolumn由命令行-v skip=1 -v column=4设置。