Perintah printf Linux: format teks, angka, dan baris baru

Perintah printf menampilkan string dan angka menurut string format yang Anda tentukan. Gunakan %s untuk teks, %d untuk bilangan bulat, dan \n pada format untuk baris baru. Format tetap dan nilai yang dikutip membantu menghasilkan keluaran skrip yang dapat diprediksi, termasuk saat nilainya mengandung spasi atau tanda persen.

Periksa printf yang dijalankan

Dalam Bash, printf biasanya merupakan perintah bawaan shell. Program eksternal dari GNU coreutils juga dapat tersedia. Jalankan type printf atau type -a printf di Bash untuk melihat resolusi perintah; dokumentasi program eksternal belum tentu menjelaskan seluruh fitur bawaan shell.

Gunakan help printf untuk bantuan bawaan Bash dan man printf untuk manual yang terpasang. Contoh berikut dapat dijalankan langsung di Bash tanpa menyiapkan berkas. Fitur khusus, opsi, lokal, dan dukungan format tetap perlu diperiksa pada implementasi yang benar-benar dipakai.

Sintaks, nilai, dan baris baru

printf 'FORMAT' [NILAI...]

FORMAT dan NILAI adalah penanda yang perlu diganti. Format memuat teks biasa, escape seperti \n, dan penentu format seperti %s. Nilai berikutnya digunakan sesuai urutan penentu format. Tanda kutip tunggal menjaga agar shell meneruskan format sebagaimana ditulis.

printf 'Hello, %s\n' Linux

Hasilnya Hello, Linux diikuti satu baris baru. String Linux mengisi %s; tanda koma dan spasi berasal dari format. Sebaliknya, printf '%s' Linux hanya menulis lima karakter tanpa baris baru. Prompt terminal dapat muncul tepat setelah kata itu.

Untuk menulis tanda persen literal pada format, gunakan dua persen: printf 'Progress: %d%%\n' 50 menghasilkan Progress: 50% dan baris baru. Persen di dalam argumen teks untuk %s tidak perlu digandakan karena argumen tersebut bukan string format.

Atur lebar dan periksa spasi hasil

Lebar bidang membantu menata keluaran sederhana tanpa menghitung spasi secara manual. Contoh berikut memakai lebar minimum 12 untuk teks yang rata kiri dan lebar minimum 5 untuk angka yang rata kanan.

printf '%-12s %5d\n' apple 42

Kata apple diikuti ruang pengisi sampai bidang teks selebar 12. Format kemudian menambahkan satu spasi pemisah, lalu bidang angka yang diisi 42 pada sisi kanan. Untuk tabel dengan lebar bidang yang dihitung dari data masukan, column -t untuk merapikan tabel teks dapat menjadi pilihan lain.

Ulangi format untuk beberapa nilai

printf '%s\n' one two three

Hasilnya one, two, dan three, masing-masing pada satu baris. Format dipakai kembali selama masih ada argumen. Untuk format dengan dua penentu, nilai dikonsumsi berpasangan: printf '%s=%d\n' apple 2 pear 3 menghasilkan apple=2 dan pear=3 pada baris terpisah.

Perhatikan jumlah argumen. Dalam Bash dan GNU printf, nilai yang kurang dapat diperlakukan sebagai string kosong atau nol. Contohnya, printf '%s=%d\n' apple dapat menghasilkan apple=0. Keluaran yang terlihat sah belum membuktikan bahwa semua data tersedia; periksa jumlah dan jenis nilai sebelum memformat laporan.

Bandingkan format dan spasi hasil

Contoh dengan tanda kurung siku memudahkan pemeriksaan ruang pengisi:

printf '[%-6s] [%03d]\n' apple 7

Contoh keluaran:

[apple ] [007]

Pada [apple ] ada satu spasi setelah apple sebelum kurung tutup karena lebar teksnya enam. Bentuk %03d mengisi angka 7 dengan nol hingga lebar minimum tiga, sehingga menjadi 007. Lebar minimum bukan batas pemotongan: printf '[%6s] [%03d]\n' longertext 12345 tetap menampilkan seluruh longertext dan 12345.

Contoh spasi di atas menggunakan ASCII. Lebar byte atau karakter yang dipakai format tertentu belum tentu sama dengan lebar visual pada terminal untuk karakter lebar atau tanda gabungan. Jangan menganggap semua bahasa akan sejajar hanya karena nilai lebar sama.

Pisahkan format tetap dari data

Jangan memakai nilai masukan sebagai string format. Tanda persen dan garis miring terbalik di dalamnya dapat ditafsirkan sebagai instruksi pemformatan. Tetapkan format sendiri dan kirim data sebagai argumen yang dikutip.

Contoh lengkapnya adalah value='100% \n *.txt two words'; printf '%s\n' "$value". Hasilnya menampilkan teks 100% \n *.txt two words secara literal, lalu satu baris baru dari format. Escape \n di dalam value tidak berubah menjadi baris baru karena nilainya dicetak dengan %s. Kutip ganda pada "$value" juga mempertahankan spasi dan mencegah ekspansi wildcard.

Bedakan dengan printf '%b\n' 'one\ntwo', yang sengaja menafsirkan escape pada argumen dan menghasilkan one serta two pada dua baris. Jika tujuan Anda menampilkan nilai sebagaimana adanya, pilih %s. Gunakan %b hanya jika penafsiran escape memang diperlukan.

Format yang sering digunakan

Format Kegunaan
%s Menampilkan nilai sebagai string tanpa menafsirkan escape di dalam nilai.
%d Menampilkan bilangan bulat dalam bentuk desimal setelah konversi argumen.
%.2f Menampilkan bilangan pecahan dengan dua angka setelah tanda desimal.
\n Escape baris baru di dalam string format.
%-Ns Menampilkan string rata kiri dalam bidang dengan lebar minimum N.
%% Menampilkan satu tanda persen literal dari string format.

Konversi angka, lokal, dan perbedaan implementasi

Format angka melakukan konversi, sehingga bukan pengganti validasi data. Pada Bash dan GNU printf, awalan nol dapat berarti bilangan oktal: printf '%d\n' 010 menghasilkan 8. Masukan seperti 08 dapat menghasilkan diagnostik dan status gagal. Jika nilainya adalah kode teks yang harus mempertahankan nol depan, gunakan %s, bukan konversi bilangan.

Untuk pecahan, LC_ALL=C printf '%.2f\n' 3.14159 menghasilkan 3.14 pada contoh ini. Lokal dapat memengaruhi pembacaan atau tampilan tanda desimal. Tentukan lokal untuk keluaran yang harus konsisten, periksa status konversi, dan jangan menyamakan pemformatan bilangan pecahan dengan aritmetika desimal eksak.

Perluasan bawaan Bash seperti -v dapat berbeda dari opsi program eksternal. Perilaku bawaan dijelaskan pada bagian printf dalam manual GNU Bash 5.3 yang ditayangkan di man7. Gunakan dokumentasi dan bantuan sesuai implementasi, bukan hanya nama perintahnya.

Untuk program eksternal, lihat manual GNU coreutils 9.11, bagian printf invocation dan ringkasan manual GNU printf.

FAQ

Apakah printf otomatis menambahkan baris baru?

Tidak. Masukkan \n pada format bila baris baru dibutuhkan, misalnya printf '%s\n' Linux. Tanpa escape itu, keluaran dapat berhenti pada posisi yang sama dengan prompt berikutnya.

Mengapa lebar format tidak memotong nilai yang panjang?

Lebar seperti %6s atau %03d menentukan lebar minimum untuk penyelarasan dan pengisian. Nilai yang memerlukan ruang lebih besar tetap dapat dicetak seluruhnya; pembatasan panjang adalah pengaturan berbeda.