我正在尝试将 / etc / passwd 文件(1,6)中的两个字段读入数组。我可以将字段变为变量而不是数组。
此代码将使所有用户超过1000并返回用户和主目录。
users=$(awk -F'[:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd)
答案 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
仅在读取命令的持续时间内设置为:
。 _
用于丢弃不需要的值。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
将输入拆分为行,并将它们存储在数组(-a
)usersAndHomeDir
({{ 1}}关闭输入中的-r
解释,大多数情况下应默认添加。)\
然后使用流程替换(< <(awk ..)
)生成<(...)
输出awk
行,并通过stdin将其提供给"<user> <home-dir>"
{{1 }})。请注意,read
的每个元素现在都是单 <
字符串,您必须稍后将其拆分为其组件。
(Bash没有提供一种并行填充两个数组的方法。)
要使用空格以外的其他内容作为分隔符,请将"${usersAndHomeDirs[@]}"
传递给"<user> <home-dir>"
命令。
让-v OFS=<separator-string>
处理输入文件通常比在shell循环中处理要快得多,但在这种特殊情况下,如果awk
文件是awk
文件,那么它可能没什么区别。短小。