如何打印包含多个单词的变量的全部内容?

如何打印包含多个单词的变量的全部内容?

我有一个包含多个单词的属性。

例子:

0x1230ac1="Brown Fox is Near"

我可以通过键入命令(使用 CLI 界面)来获取属性的内容,如下所示:

show attr=0x1230ac1

这个“show”命令的输出如下所示:

ID            Name                  Value
0x1230ac1     User_Attribute1       Brown Fox is Near

如果我在 bash 脚本中使用相同的“show”命令,我可以这样做:

show attr=0x1230ac1 | sed 1d | awk '{print $1,$3,$4,$5,$6}'

这是有问题的,因为“值”列中的字符串可能有 2 个单词或 20 个单词。我不想为每个人都做一个 awk。

有没有一种方法可以让 awk 或 sed 或其他方法传递 'Value' 的全部内容,以便在我的 CLI 脚本中它将显示 'Value' 中包含的所有单词?这很重要,因为我需要将“值”传递给脚本中的字符串变量。

例子:

MYSTRING=`show attr=0x1230ac1 | sed 1d | awk '{print $3-$99}' `

我知道这print $3-$99是不正确的。这只是我试图做的示例,而不必输入所有可能的打印编号。

答案1

在 awk 中,您可以通过为某些字段/列分配空字符串来删除它们:

$ echo foo bar doo | awk '{$2 = ""; print}'
foo  doo

然而,这会在字段原来所在的位置留下一个空白,并折叠行中的其他空白,就像asdf这里之前的空格一样:

$ echo "foo bar doo    asdf"  | awk '{$2 = ""; print}'
foo  doo asdf

相反,您可以使用sed适当的正则表达式做一些事情:

$ echo '0x1230ac1     User_Attribute1       Brown Fox is Near' |
  sed -Ee 's/([^[:space:]]+[[:space:]]+){2}//'
Brown Fox is Near

[^[:space:]]+匹配一系列非空白字符、[[:space:]]+一串空白以及周围的内容(...){2}都会执行两次,因此第二次空白之前的所有内容都会被删除。如果空白是空格或制表符,那么这应该有效。

所以,如果我的情况正确的话,应该这样做:

$ show attr=0x1230ac1 | sed -E -e 1d -e 's/([^[:space:]]+[[:space:]]+){2}//'

答案2

您可以使用 gnu sed 来执行此操作:

sed -nEe '2s/\S+/\n&/3;s/.*\n//p'

假设该变量没有换行符。并且用户 ID 不包含空格。

相关内容