リストをファイルに保存せずにリストを繰り返す方法(最後まで各行を読む)は何ですか?

リストをファイルに保存せずにリストを繰り返す方法(最後まで各行を読む)は何ですか?

以下のコマンドは、最小パスワード使用期間が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は実行されません(もちろん、この場合は少ない可能性があります)。

関連情報