我有一个包含多个单词的属性。
例子:
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 不包含空格。