【问题标题】:AWK output to bash ArrayAWK 输出到 bash 数组
【发布时间】:2011-05-02 15:48:03
【问题描述】:

我试图将一个简单命令的内容放入一个 bash 数组中,但是我遇到了一些麻烦。

df -h | awk '{ print  $5" "$6 }'

给出我系统上文件系统中使用的百分比 输出如下所示:

1% /dev
1% /dev/shm
1% /var/run
0% /var/lock
22% /boot
22% /home
22% /home/steve

然后我想将这些行中的每一行放入一个 bash 数组中 数组=$(df -h| awk '{ print $5 $6 }')

但是,当我打印出数组时,我得到以下信息:

5%
/
1%
/dev
1%
/dev/shm
1%
/var/run
0%
/var/lock
22%
/boot
22%
/home
22%
/home/steve

Bash 是基于空格而不是换行符形成数组我该如何解决这个问题?

【问题讨论】:

  • 将数组放入 bash 后,您想对它做什么?我的意思是......也许你可以在 awk 中做到这一点......
  • 那么脚本的下一部分将在所选文件系统上运行类似于此命令“find . -type f -exec du -sh {} \; | sort -h”的内容(用户会在第一部分中选择一个从阵列中填充太多的文件系统)。我想修改第二个命令,只显示文件系统中最大的 10 个文件,以便用户可以选择是否删除它们

标签: arrays bash awk


【解决方案1】:

您需要重置 IFS 变量(用于数组的分隔符)。

OIFS=$IFS #save original
IFS=','
df -h | awk '{ print $5" "$6"," }'

【讨论】:

  • 不客气。如果这对您来说是正确的答案,您应该投票并标记为已接受的答案。
  • 您可以省略 AWK 命令中的逗号并将IFS 设置为换行符:IFS=$'\n'(之后不要忘记IFS=$OIFS)。
  • 我注意到在 ifs 中使用换行符时有时会出现奇怪的行为。我已经养成了使用逗号的习惯。
【解决方案2】:

你可以在没有 awk 的情况下在 Bash 中做到这一点。

array=()
while read -a line; do
    array+=("${line[4]} ${line[5]}")
done < <(df -h)

【讨论】:

    【解决方案3】:

    你可以使用这个:

    eval array=( $(df -h | awk '{ printf("\"%s %s\" ", $5, $6) }') )
    

    【讨论】:

    • eval 有什么用?只需去掉 AWK 命令中多余的引号,直接进行数组赋值即可。
    猜你喜欢
    • 2014-03-28
    • 2013-02-12
    • 2020-01-15
    • 2013-05-31
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多