Dalam bash, bagaimana cara melewatkan input while ke perintah cut?


2

Bagaimana cara melewatkan $ line ke perintah cut dengan benar di loop ini?

while read line
do
    login= $(cut -d : -f 1)

done < /etc/passwd

Saya tidak bisa melakukannya $(cut -d : -f 1 $line) jadi apa cara yang benar?

Jawaban:


1

Anda sebenarnya tidak memerlukan loop sementara jika niat Anda hanya untuk membuat daftar nama. Juga ada kesalahan sintaks setelah login=, seharusnya tidak ada ruang.

cut -d: -f1 /etc/passwd | \
while read login; 
do 
    echo username: $login;
done

atau ketika Anda mencoba:

while read line; do
   login=$(echo $line | cut -d : -f 1)
   echo $login
done < /etc/passwd

bahkan lebih baik:

db-getent passwd |cut -d: -f1 | xargs -L1 echo name:

1
+1 untuk getent. Dalam contoh pertama Anda, kelanjutan garis tidak diperlukan setelah pipa.
glenn jackman

Sempurna! Terima kasih Ярослав, loop adalah potongan kode dari loop sementara yang lebih besar sehingga saran kedua Anda cocok untuk saya.
Mike

3

Biarkan read perintah bersama dengan shell IFS variabel menguraikan baris untuk Anda:

while IFS=: read -r login restOfLine; do
    doSomethingWith $login
done < /etc/passwd

Untuk menjawab pertanyaan Anda, bash-string di sini akan bermanfaat:

login=$(cut -d: -f1 <<< "$line")

Senar di sini bagus dan rapi. Aku suka itu! Tepuk tangan.
Mike

2

Menggunakan gema :

login=$(echo "$line" | cut -d : -f 1)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.