Perintah tac Linux: urutan baris terbalik dan pemisah rekaman

tac menampilkan rekaman data dari yang terakhir ke yang pertama; pemisah defaultnya adalah karakter baris baru, sehingga biasanya yang dibalik adalah urutan baris. Isi setiap baris tetap sama. Ini berguna untuk membaca log dari bawah, tetapi baris paling bawah hanya berarti kejadian terbaru bila file memang disusun menurut waktu.

Contoh menggunakan GNU Coreutils. Periksa tac --help dan man tac pada sistem tujuan. Buat direktori latihan baru dengan mkdir -- tac-lab && cd -- tac-lab, hentikan jika gagal, dan gunakan file uji milik Anda dengan nama yang belum dipakai. Perintah tac membaca input tanpa menyuntingnya; penyiapan contoh hanya memakai file latihan baru. Menyimpan hasil melalui shell memerlukan tujuan terpisah.

Nama tac adalah cat yang ditulis terbalik. Rekaman (record) adalah unit data yang dibatasi pemisah. GNU tac membalik urutan unit itu, bukan otomatis urutan karakter. Beberapa nama file diproses menurut urutan argumen; pembalikan dilakukan di dalam masing-masing file. Tanpa nama file, atau dengan operand -, input dibaca dari masukan standar.

Sintaks dasar

tac [OPSI]... [FILE]...

Dukungan dan detail opsi dapat berbeda di luar GNU. Kutip jalur yang berisi spasi dan gunakan -- sebelum nama berawalan tanda hubung, misalnya tac -- "-events saya.log". Untuk file bernama tepat -, gunakan ./- agar tidak ditafsirkan sebagai masukan standar.

Penggunaan dasar tac

Membalik baris dalam file

Siapkan events.log berisi baris kejadian yang ingin diperiksa. Baris terakhir akan ditampilkan dahulu. tac tidak mengedit urutan pada file sumber; hasilnya dikirim ke keluaran standar, biasanya terminal.

tac events.log

Memproses beberapa file

Siapkan kedua file latihan. Jika january.log berisi Jan1 lalu Jan2 dan february.log berisi Feb1 lalu Feb2, masing-masing dengan akhir baris baru, hasilnya adalah Jan2, Jan1, Feb2, Feb1. File Februari tidak otomatis dipindahkan ke depan dan isi kedua file tidak diurutkan menurut waktu.

tac january.log february.log

Membalik input standar

Pipa mengirim keluaran perintah pertama sebagai masukan standar tac. Input yang tidak mendukung perpindahan posisi baca, seperti pipa, harus diterima sampai akhir sebelum hasil terbalik dapat dimulai. Pada contoh terbatas berikut, keluaran menjadi three, two, lalu one. Sebaliknya, file biasa yang mendukung perpindahan posisi baca memungkinkan tac membaca dari bagian akhir.

printf 'one\ntwo\nthree\n' | tac

Hasil pembalikan urutan baris

Contoh ini menggunakan tiga baris yang semuanya berakhir dengan baris baru. Hasilnya membalik urutan baris, sementara ejaan first, second, dan third tetap.

printf 'first\nsecond\nthird\n' | tac

Contoh output:

third
second
first

Hasil tersebut bukan pengurutan berdasarkan stempel waktu. Perhatikan juga akhir file: pemisah default melekat pada akhir rekaman. Bila input hanya A, baris baru, lalu B tanpa baris baru terakhir, hasil GNU tac adalah BA diikuti baris baru. Tac tidak menambahkan pemisah yang hilang, sehingga bentuk output dapat mengejutkan pada file yang tidak diakhiri baris baru.

Opsi utama

Opsi Tujuan
-s STRING Gunakan STRING sebagai pemisah rekaman, bukan newline.
-b Pasang pemisah sebelum rekaman, bukan setelahnya.
-r Tafsirkan pemisah sebagai ekspresi reguler.
--help Tampilkan opsi yang didukung oleh implementasi yang terpasang.

Opsi -b mengubah pengelompokan: pemisah dianggap melekat pada awal rekaman berikutnya. Untuk input ---A---B---C, tac -b -s "---" FILE menghasilkan ---C---B---A. Pilih aturan ini hanya bila format input memang memakai pemisah di depan; opsi itu tidak sekadar memindahkan tanda pemisah secara kosmetik.

Contoh praktis

Jelajahi log dari yang terbaru ke yang terlama

Siapkan application.log sebagai log teks latihan yang terbatas. less adalah pembaca per halaman: gunakan Space untuk maju, /kata lalu Enter untuk mencari, dan q untuk keluar. Pembalikan baris cocok untuk satu kejadian per baris; jejak kesalahan atau pesan yang terdiri atas beberapa baris dapat kehilangan susunan internalnya.

tac application.log | less

Gunakan pemisah rekaman khusus

Contoh lengkap berikut membuat tiga rekaman dengan pemisah literal --- di akhir masing-masing rekaman, tanpa baris baru tambahan. Hasilnya adalah C---B---A---. Secara default pemisah tetap bersama akhir rekaman; jika inputnya A---B---C tanpa pemisah terakhir, hasilnya menjadi CB---A---, bukan tiga rekaman baru yang dipisahkan ulang.

printf '%s' 'A---B---C---' > records.txt &&
tac -s '---' -- records.txt

Temukan baris yang cocok paling baru

Siapkan access.log dengan satu kejadian per baris dan urutan waktu yang sesuai. grep -m 1 berhenti setelah satu baris cocok, sehingga ERROR terakhir dalam urutan file ditemukan dahulu. Ini pencarian peka huruf besar/kecil, bukan penilaian tingkat keparahan: error tidak cocok. Menurut manual GNU grep dalam paket Debian, status 0 berarti ada kecocokan, 1 berarti tidak ada, dan 2 menandakan kesalahan.

tac access.log | grep -m 1 'ERROR'

Jangan menganggap sebuah baris hasil berarti seluruh pipeline berhasil. Jika grep berhenti lebih awal, tac dapat menerima sinyal pipa tertutup (SIGPIPE) karena pembacanya sudah selesai. Dalam skrip Bash dengan pipefail, ini dapat membuat status pipeline tidak nol meskipun kecocokan ditemukan. Periksa status tiap tahap dan pesan kesalahan; jangan menambahkan || true secara membabi buta karena kegagalan membaca file juga dapat tersembunyi.

Perbandingan dengan perintah lain

Referensi perintah Linux berdasarkan tugas (bahasa Inggris) membantu memilih pembaca, penyaring, atau pengurut ketika pembalikan rekaman bukan pekerjaan yang diperlukan.

Perintah Peran utama Cocok untuk
tac Membalik urutan rekaman yang ada Membaca file dari bawah
cat Mempertahankan urutan asli Menampilkan dan menggabungkan file
tail (bahasa Inggris) Pilih bagian akhir Menampilkan hanya baris terbaru
sort -r Urutkan nilai secara menurun Mengurutkan berdasarkan konten

Hal yang perlu diperhatikan

Ini bukan perintah pengurutan

Tac hanya membalik urutan rekaman yang ada. sort -r justru membandingkan isi dan menyusun urutan menurun menurut aturan pengurutan yang berlaku. Log yang terlambat ditulis, tercampur sumber lain, atau memiliki stempel waktu tidak berurutan memerlukan pemrosesan waktu yang sesuai, bukan sekadar tac.

Aliran tanpa batas tidak dapat dibalik dengan cepat

Pipa yang tidak pernah selesai tidak memiliki rekaman terakhir yang tetap, sehingga tail -f FILE | tac bukan cara memantau log langsung. GNU tac dapat memakai penyimpanan sementara untuk input yang tidak mendukung perpindahan posisi baca; pastikan direktori sementara yang dipilih melalui TMPDIR atau lokasi default memiliki izin dan kapasitas yang cukup. Untuk pemantauan berkelanjutan gunakan tail -f secara langsung.

Periksa portabilitas pemisah

Perilaku pemisah di sini mengikuti GNU tac. Kutip string dan pola agar shell tidak mengembangkannya. -r menafsirkan pemisah sebagai ekspresi reguler, bukan menyortir atau mencari baris yang cocok. Sebagai contoh, untuk data A|B|C|, tac -r -s "[|]" FILE menggunakan karakter garis vertikal sebagai pemisah. Tanpa -r, string [|] dicari secara literal. Uji pola pada data kecil sebelum memproses format kompleks.

FAQ

Apakah tac dan sort -r setara?

Tidak. Tac membalik urutan rekaman saat ini, sedangkan sort -r membandingkan isinya dan mengurutkan secara menurun.

Bagaimana cara membalik hanya sepuluh baris terakhir?

Gunakan tail -n 10 FILE | tac pada input terbatas. Ini mengambil sepuluh baris terakhir lebih dahulu lalu membalik urutannya, bukan membalik seluruh file terlebih dahulu.

Apakah tac bisa mengikuti log yang sedang berjalan?

Bukan untuk mengikuti aliran tanpa akhir melalui pipa, karena tac perlu mengetahui akhir input itu. Gunakan tail -f untuk pemantauan langsung.

Apakah tac menggabungkan semua file input sebelum membaliknya?

Tidak. tac FILE1 FILE2 membalik rekaman di FILE1, kemudian di FILE2. Untuk membalik satu aliran gabungan, input pipa yang sudah digabung merupakan operasi yang berbeda.

Dokumentasi resmi