将awk的输出保存为两个不同的变量

时间:2015-06-18 14:20:46

标签: bash shell variables awk

好。我有点迷茫,谷歌搜索对我帮助不大。 我有一个命令:

filesize_filename=$(echo $line | awk ' ''{print $5":"$9}') 
echo $filesize_filename 
1024:/home/test

现在这个将两个返回或awk'ed项目保存到一个变量中。我想实现这样的目标:

filesize,filename=$(echo $line | awk ' ''{print $5":"$9}')

所以我可以像

那样单独访问它们
echo $filesize
1024

echo $filename
/home/test

如何实现这一目标?

感谢。

3 个答案:

答案 0 :(得分:3)

使用awk输出填充shell数组,然后随意执行任何操作:

$ fileInfo=( $(echo "foo 1024 bar /home/test" | awk '{print $2, $4}') )
$ echo "${fileInfo[0]}"
1024
$ echo "${fileInfo[1]}"
/home/test

如果文件名可以包含空格,那么您必须适当调整awk中的FS和OFS以及shell中的IFS。

你当然可能根本不需要awk:

$ line="foo 1024 bar /home/test"
$ fileInfo=( $line )
$ echo "${fileInfo[1]}"
1024
$ echo "${fileInfo[3]}"
/home/test

但要小心在最后一种情况下匹配本地文件名的$line中的globbing字符。我希望有一种更健壮的方法可以从shell变量填充shell数组,但是我无法想到它。

答案 1 :(得分:2)

使用bash的read

read size name < "$(awk '{print $5, $9}' <<< "$line")"

# Now you can output them separately
echo "$size"
echo "$name"

答案 2 :(得分:2)

您可以在awk的输出中使用进程替换:

read filesize filename < <(echo "$line" | awk '{print $5,$9}')

你可以完全避免使用awk:

read _ _ _ _ filesize _ _ _ filename _ <<< "$line"