Como fazer loop em uma lista (lendo cada linha até o final) sem salvar a lista como um arquivo?

0

O comando abaixo me fornecerá uma lista de usuários que não têm uma vida mínima de senha de 1 dia. Isso funciona corretamente.

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

Eu quero pegar essa lista e executar ...

chage -m 1 $p

em que $ p é o nome de usuário em cada linha.

Normalmente, eu salvaria essa lista como um arquivo e, em seguida, executaria um loop while contra ela. Veja abaixo o meu comando completo para alterar todos os usuários para uma senha mínima de 1 dia.

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

Existe uma maneira de fazer a mesma coisa logicamente, mas sem ter que salvar um arquivo? Esta é uma prática recomendada?

Eu acho que seria uma maneira de fazer isso com um comando pipe, mas não consigo encontrar uma maneira adequada de estruturá-lo.

    
por TrevorKS 20.07.2018 / 03:52

2 respostas

2

Ou com um cano

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

ou com substituição de processos

while read p; do
      chage -m 1 "$p"
done < <(awk -F: '$4 < 1 {print $1}' /etc/shadow)
    
por 20.07.2018 / 03:56
0
awk -F: '$4 < 1 {print $1}' /etc/shadow | xargs -r -L 1 chage -m 1

O -L 1 garante que cada linha da saída awk seja passada para uma chamada separada chage , e o -r garante que chage não seja executado se awk não produz nada (o que, reconhecidamente, é bastante improvável neste caso).

    
por 20.07.2018 / 06:57