Linux读入数组

时间:2016-10-21 13:41:38

标签: linux bash

我正在尝试将 / etc / passwd 文件(1,6)中的两个字段读入数组。我可以将字段变为变量而不是数组。

此代码将使所有用户超过1000并返回用户和主目录。

users=$(awk -F'[:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd)

2 个答案:

答案 0 :(得分:1)

试试这个:

while IFS=: read -r user _ uid _ _ homedir _
do
    (( uid > 999 && uid != 65534 )) && arr+=( "$user":"$homedir" )
done < "/etc/passwd"

printf '%s\n' "${arr[@]}"

此脚本处理/etc/password读取while循环中的每一行。

  • 每行分为$IFS的值。
  • $IFS仅在读取命令的持续时间内设置为:
  • 将拆分值分配给多个变量(user,uid,homedir,_)。
  • 变量_用于丢弃不需要的值。
  • 然后,只有当uid有效时,才会在阵列中添加一条记录(+=(…))。
  • 数组中的记录使用冒号(:
  • 连接

答案 1 :(得分:0)

提供soronta's helpful and well-explained answer替代awk

IFS=$'\n' read -d '' -ra usersAndHomeDirs < \
  <(awk -F':' '$3 >= 10 && $3 != 65534 { print $1, $6 }' /etc/passwd)
  • -d ''告诉read将整个输入作为一个读取,
  • IFS=$'\n'告诉read将输入拆分为,并将它们存储在数组(-ausersAndHomeDir({{ 1}}关闭输入中的-r解释,大多数情况下应默认添加。)
  • \然后使用流程替换(< <(awk ..))生成<(...)输出awk行,并通过stdin将其提供给"<user> <home-dir>" {{1 }})。

请注意,read的每个元素现在都是 <字符串,您必须稍后将其拆分为其组件。
(Bash没有提供一种并行填充两个数组的方法。)

要使用空格以外的其他内容作为分隔符,请将"${usersAndHomeDirs[@]}"传递给"<user> <home-dir>"命令。

-v OFS=<separator-string>处理输入文件通常比在shell循环中处理要快得多,但在这种特殊情况下,如果awk文件是awk文件,那么它可能没什么区别。短小。