목록을 파일에 저장하지 않고 목록을 반복하는 방법(끝까지 각 줄을 읽음)은 무엇입니까?

목록을 파일에 저장하지 않고 목록을 반복하는 방법(끝까지 각 줄을 읽음)은 무엇입니까?

아래 명령은 최소 비밀번호 사용 기간이 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이 실행되지 않습니다(물론 이 경우에는 가능성이 낮습니다).

관련 정보