如何 while 循环列表(读取每一行直到最后)而不将列表保存为文件?

如何 while 循环列表(读取每一行直到最后)而不将列表保存为文件?

下面的命令将为我提供不具有 1 天最短密码寿命的用户列表。这工作正常。

awk -F: '$4 < 1 {print $1}' /etc/shadow

我想拿着这个清单,然后运行......

chage -m 1 $p

其中 $p 是每行的用户名。

通常,我会将此列表保存为文件,然后对其运行 while 循环。请参阅下文,了解将所有用户更改为 1 天最短密码的完整命令。

mkdir ./tmp
awk -F: '$4 < 1 {print $1}' /etc/shadow > ./tmp/usernamelist

while read p; do
      chage -m 1 $p
done <./tmp/usernamelist

rm -rf ./tmp/usernamelist

有没有一种方法可以逻辑地执行相同的操作,但无需保存文件?这是最佳实践吗?

我认为有一种方法可以使用管道命令来做到这一点,但我找不到正确的方法来构造它。

答案1

要么用管子

awk -F: '$4 < 1 {print $1}' /etc/shadow |
while read p; do
      chage -m 1 "$p"
done

或通过流程替换

while read p; do
      chage -m 1 "$p"
done < <(awk -F: '$4 < 1 {print $1}' /etc/shadow)

答案2

awk -F: '$4 < 1 {print $1}' /etc/shadow | xargs -r -L 1 chage -m 1

确保-L 1awk 输出的每一行都传递到一个单独的查格调用,并-r确保查格如果 awk 不输出任何内容,则不会执行 run (诚然,在这种情况下不太可能)。

相关内容