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.