Melanjutkan tur dari perintah yang tidak terlalu terkenal yang dimulai minggu lalu dengan perintah ls, mari kita periksa hari ini cat
perintah.
cat
nama singkatan dari catenate
karena tugas utama dari perintah itu adalah menggabungkan beberapa file input dengan mengirimkan kontennya secara berurutan pada output standar:
# Let's obtain first some sample data files:
curl -so - dict://dict.org/'d:felidae:gcide' | unexpand -a -t 3 |
sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felidae.txt
curl -so - dict://dict.org/'d:felis:gcide' | unexpand -a -t 3 |
sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felis.txt
# Catenate files
cat felidae.txt felis.txt
Jika Anda ingin menyimpan hasil penggabungan itu dalam sebuah file, Anda harus menggunakan pengalihan shell:
cat felidae.txt felis.txt > result.txt
cat result.txt
Meskipun tujuan desain utamanya adalah untuk mengcatenate file, cat
utilitas juga sering digunakan dengan hanya satu argumen untuk menampilkan konten file itu ke layar, persis seperti yang saya lakukan pada baris terakhir dari contoh di atas.
A. Menggunakan perintah cat dengan input standar
Saat digunakan tanpa argumen apa pun, cat
perintah akan membaca data dari input standarnya dan menulisnya ke output standarnya— yang sebagian besar tidak berguna ... kecuali jika Anda menggunakan beberapa opsi untuk mengubah data. Kami akan membicarakan beberapa opsi menarik nanti.
Selain jalur file, cat
perintah juga memahami -
nama file khusus sebagai alias untuk input standar. Dengan begitu, Anda dapat menyisipkan data yang dibaca dari input standar di antara file yang diberikan pada baris perintah:
# Insert a separator between the two concatenated files
echo '----' | cat felis.txt - felidae.txt
B. Menggunakan perintah cat dengan file biner
1. Bergabung dengan file terpisah
cat
perintah tidak membuat asumsi apa pun tentang konten file, sehingga dengan senang hati akan bekerja dengan data biner. Sesuatu yang mungkin berguna untuk menggabungkan kembali file yang rusak karena split
atau csplit
memerintah. Atau untuk bergabung dengan unduhan parsial seperti yang akan kami lakukan sekarang:
#
# A picture by Von.grzanka (CC-SA 3.0)
# Optimize bandwidth usage by breaking the download in two parts
# (on my system, I observe a 10% gain that way compared to a "full" download)
curl -s -r 0-50000 \
https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
-o first-half &
curl -s -r 50001- \
https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
-o second-half &
wait
Kami sekarang memiliki dua bagian dari sebuah gambar. Anda dapat membuka paruh pertama dan melihatnya "rusak" menggunakan display
ImageMagick , atau gimp
, atau perangkat lunak lain yang dapat membaca file gambar:
display first-half
# -or-
gimp first-half
# -or-
firefox first-half
Jika Anda mempelajari curl
perintah yang saya gunakan, Anda melihat kedua bagian itu saling melengkapi. Bagian pertama dari byte 0 hingga 50000 dan paruh kedua, dari byte 50001 hingga akhir file. Seharusnya tidak ada data yang hilang di antara mereka. Jadi kita hanya perlu menggabungkan dua bagian (dalam urutan yang benar) untuk mendapatkan kembali file lengkapnya:
cat first-half second-half > image.jpg
display image.jpg
2. Bekerja dengan format file yang dapat dialirkan
Anda tidak hanya dapat menggunakan cat
perintah untuk "menggabungkan kembali" file biner yang dipecah menjadi beberapa bagian, tetapi dalam beberapa kasus, Anda juga dapat membuat baru file dengan cara itu. Itu bekerja sangat baik dengan format file "tanpa header" atau "dapat dialirkan" seperti file video streaming transportasi MPEG (.TS
file):
# Let's make a still video file from our picture
ffmpeg -y -loop 1 -i cat.jpg -t 3 \
-c:v libx264 -vf scale=w=800:h=-1 \
still.ts
# Let's make a fade-in from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3 \
-c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 \
fadein.ts
# Let's make a fade-out from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3 \
-c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 \
fadeout.ts
Kami sekarang dapat menggabungkan semua file video aliran transportasi tersebut menggunakan cat
perintah, mendapatkan file TS yang benar-benar valid dalam output:
cat fadein.ts still.ts fadeout.ts > video.ts
mplayer video.ts
Berkat format file TS, Anda dapat menggabungkan file-file itu dalam urutan yang Anda inginkan, dan Anda bahkan dapat menggunakan file yang sama beberapa kali dalam daftar argumen untuk membuat loop atau pengulangan dalam video output. Jelas, ini akan lebih menyenangkan jika kita menggunakan gambar animasi, tetapi saya akan membiarkan Anda melakukannya sendiri:banyak perangkat kelas konsumen merekam file TS, dan jika tidak, Anda masih dapat menggunakan ffmpeg
untuk mengonversi hampir semua file video ke file aliran transportasi. Jangan ragu untuk membagikan kreasi Anda menggunakan bagian komentar!
3. Meretas arsip cpio
Sebagai contoh terakhir, mari kita lihat bagaimana kita dapat menggunakan cat
perintah untuk menggabungkan beberapa cpio
arsip. Namun kali ini tidak akan semudah itu karena akan membutuhkan sedikit pengetahuan tentang cpio
format file arsip.
Sebuah cpio
arsip menyimpan metadata dan konten file secara berurutan yang membuatnya cocok untuk penggabungan tingkat file dengan cat
kegunaan. Sayangnya, cpio
arsip juga berisi cuplikan yang digunakan untuk menandai akhir arsip:
# Create two genuine CPIO `bin` archive:
$ find felis.txt felidae.txt | cpio -o > part1.cpio
2 blocks
$ echo cat.jpg | cpio -o > part2.cpio
238 blocks
$ hexdump -C part1.cpio | tail -7
000002d0 2e 0d 0a 09 09 20 20 5b 57 6f 72 64 4e 65 74 20 |..... [WordNet |
000002e0 31 2e 35 5d 0d 0a 0a 00 c7 71 00 00 00 00 00 00 |1.5].....q......|
000002f0 00 00 00 00 01 00 00 00 00 00 00 00 0b 00 00 00 |................|
00000300 00 00 54 52 41 49 4c 45 52 21 21 21 00 00 00 00 |..TRAILER!!!....|
00000310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400
$ hexdump -C part2.cpio | tail -7
0001da40 46 96 ab f8 ad 11 23 90 32 79 ac 1f 8f ff d9 00 |F.....#.2y......|
0001da50 c7 71 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |.q..............|
0001da60 00 00 00 00 0b 00 00 00 00 00 54 52 41 49 4c 45 |..........TRAILE|
0001da70 52 21 21 21 00 00 00 00 00 00 00 00 00 00 00 00 |R!!!............|
0001da80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0001dc00
Hal baru yang baik adalah, dengan arsip biner cpio, trailer tersebut memiliki panjang tetap 280 byte. Jadi, menggunakan head
perintah standar, kami memiliki cara mudah untuk menghapusnya:
# Each archive end with the 280-byte trailer.
# To catenate both archives, just remove the trailer
# at the end of the first part:
$ head -c-280 part1.cpio | cat - part2.cpio > cat.cpio
$ cpio -it < cat.cpio
felis.txt
felidae.txt
cat.jpg
239 blocks
C. Opsi perintah kucing penting
Setelah bermain dengan berbagai format file biner, mari kembali ke file teks biasa sekarang dengan mempelajari beberapa opsi yang dirancang khusus untuk menangani file-file tersebut. Meskipun bukan bagian dari standar POSIX, opsi tersebut portabel di seluruh cat
BSD dan GNU implementasi. Harap dicatat saya tidak berpura-pura menjadi lengkap di sini, jadi periksa man
untuk melihat daftar lengkap opsi yang didukung oleh cat
di sistem Anda!
-n
:garis bilangan
Dengan n
opsi, cat
perintah akan mengawali setiap baris keluaran dengan nomor barisnya:
cat -n felidae.txt
1
2 Felidae \Felidae\ n.
3 a natural family of lithe-bodied round-headed fissiped
4 mammals, including the cats; wildcats; lions; leopards;
5 cheetahs; and saber-toothed tigers.
6
7 Syn: family {Felidae}.
8 [WordNet 1.5]
9
-n
nomor opsi keluaran garis. Itu berarti penghitungnya bukan reset saat berpindah dari satu file input ke file berikutnya, seperti yang akan Anda lihat jika Anda mencoba sendiri perintah berikut:
cat -n feli*.txt
-s
:menekan baris output kosong yang berulang
Dengan -s
opsi, cat
perintah akan menciutkan beberapa baris kosong berturut-turut hanya dalam satu:
cat -n felis.txt felidae.txt | sed -n 8,13p
8 lynx ({Felis lynx}) is also called {Lynx lynx}.
9 [1913 Webster +PJC]
10
11
12 Felidae \Felidae\ n.
13 a natural family of lithe-bodied round-headed fissiped
[email protected]:~$ cat -ns felis.txt felidae.txt | sed -n 8,13p
8 lynx ({Felis lynx}) is also called {Lynx lynx}.
9 [1913 Webster +PJC]
10
11 Felidae \Felidae\ n.
12 a natural family of lithe-bodied round-headed fissiped
13 mammals, including the cats; wildcats; lions; leopards;
Pada contoh di atas, Anda dapat melihat, pada output default, baris 10 dan 11 kosong. Saat menambahkan -s
pilihan, baris kosong kedua dibuang.
-b
:hanya nomor baris yang tidak kosong
Agak terkait dengan dua opsi sebelumnya, -b
opsi akan memberi nomor pada baris, tetapi mengabaikan yang kosong:
$ cat -b felidae.txt | cat -n
1
2 1 Felidae \Felidae\ n.
3 2 a natural family of lithe-bodied round-headed fissiped
4 3 mammals, including the cats; wildcats; lions; leopards;
5 4 cheetahs; and saber-toothed tigers.
6 5
7 6 Syn: family {Felidae}.
8 7 [WordNet 1.5]
9
Contoh di atas menggunakan dua contoh cat
perintah dengan opsi berbeda dalam pipa. Penomoran bagian dalam berasal dari -b
opsi yang digunakan dengan cat
first pertama memerintah. Penomoran luar berasal dari -n
opsi yang digunakan dengan cat
second kedua .
Seperti yang Anda lihat, baris pertama dan terakhir adalah bukan diberi nomor dengan -b
pilihan karena kosong. Tapi bagaimana dengan baris ke-6? Kenapa masih diberi nomor -b
pilihan? Ya, karena ini adalah kosong baris— tapi bukan kosong satu, seperti yang akan kita lihat di bagian berikutnya.
-v
, -e
, -t
:menampilkan karakter non-cetak
Tiga opsi -v
, -e `, and `-t
digunakan untuk menampilkan set karakter yang tidak terlihat. Meskipun kumpulannya tumpang tindih, tidak ada opsi “tangkap semua”, jadi Anda harus menggabungkannya jika ingin menampilkan semua karakter tak terlihat.
-v
:melihat karakter tak terlihat
-v
opsi menampilkan semua karakter non-cetak dengan tanda sisipan dan notasi meta, kecuali umpan baris dan tabulasi.
Dengan opsi itu, karakter kontrol akan muncul sebagai tanda sisipan (^
) diikuti oleh karakter ASCII yang sesuai (misalnya, carriage return, byte 13, ditampilkan sebagai ^M
karena M
di ASCII adalah 64 + 13), dan karakter dengan set bit orde tinggi akan muncul dalam notasi "meta" M-
diikuti oleh representasi yang sesuai dengan 7 bit yang lebih rendah (misalnya, byte 141 akan ditampilkan sebagai M-^M
karena 141 sama dengan 128 + 13).
Meskipun tampaknya esoteris, fitur itu mungkin berguna saat bekerja dengan file biner, seperti, misalnya, jika Anda ingin memeriksa informasi mentah yang disematkan dalam file JPEG:
$ cat -v cat.jpg | fold -75 | head -10
M-^?M-XM-^?M-`^@^PJFIF^@^A^A^A^@H^@H^@^@M-^?M-~^@QFile source: http://commo
ns.wikimedia.org/wiki/File:Felis_catus-cat_on_snow.jpgM-^?M-b^LXICC_PROFILE
^@^A^A^@^@^LHLino^B^P^@^@mntrRGB XYZ ^GM-N^@^B^@ ^@^F^@1^@^@acspMSFT
^@^@^@^@IEC sRGB^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-vM-V^@^A^@^@^@^@M-S-HP ^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^Qcprt^@^@^AP^@^@^@3desc^@^@^AM-^D^@^@^@lwtpt^@^@^AM-p^@^@^@^
Tbkpt^@^@^B^D^@^@^@^TrXYZ^@^@^B^X^@^@^@^TgXYZ^@^@^B,^@^@^@^TbXYZ^@^@^[email protected]^@^@
^@^Tdmnd^@^@^BT^@^@^@pdmdd^@^@^BM-D^@^@^@M-^Hvued^@^@^CL^@^@^@M-^Fview^@^@^
CM-T^@^@^@$lumi^@^@^CM-x^@^@^@^Tmeas^@^@^D^L^@^@^@$tech^@^@^D0^@^@^@^LrTRC^
@^@^D<^@^@^H^LgTRC^@^@^D<^@^@^H^LbTRC^@^@^D<^@^@^H^Ltext^@^@^@^@Copyright (
Kasus penggunaan lain untuk -v
pilihannya adalah menemukan karakter kontrol yang mungkin bocor ke dalam file teks. Jika Anda mengingatnya, kami memiliki masalah aneh di atas dengan -b
opsi penomoran baris input ke-6, sedangkan itu tampak seperti itu kosong. Jadi mari kita selidiki bahwa:
$ cat -v felidae.txt
Felidae \Felidae\ n.^M
a natural family of lithe-bodied round-headed fissiped^M
mammals, including the cats; wildcats; lions; leopards;^M
cheetahs; and saber-toothed tigers.^M
^M
Syn: family {Felidae}.^M
[WordNet 1.5]^M
Ah ah! Apakah Anda melihat ^M
itu? tanda? Mereka digunakan untuk menggantikan karakter carriage return yang tidak terlihat. Dari mana asalnya? Nah, dict
protokol, seperti protokol Internet lainnya, menggunakan CRLF sebagai terminator baris. Jadi kami mengunduhnya sebagai bagian dari file sampel kami. Anda dapat mempelajari lebih lanjut tentang line feed dan carriage return di fold
dan fmt
artikel. Tapi untuk saat ini, ini menjelaskan mengapa cat
menganggap baris ke-6 tidak kosong.
-e
:menampilkan karakter yang tidak terlihat, termasuk akhir baris
-e
opsi berfungsi seperti -v
pilihan, kecuali itu juga akan menambahkan tanda dolar ($
) sebelum setiap karakter umpan baris, sehingga secara eksplisit menunjukkan akhir baris:
$ cat -e felidae.txt
$
Felidae \Felidae\ n.^M$
a natural family of lithe-bodied round-headed fissiped^M$
mammals, including the cats; wildcats; lions; leopards;^M$
cheetahs; and saber-toothed tigers.^M$
^M$
Syn: family {Felidae}.^M$
[WordNet 1.5]^M$
$
-t
:menampilkan karakter yang tidak terlihat, termasuk tab
-t
opsi berfungsi seperti -v
pilihan, selain itu juga akan menampilkan tabulasi menggunakan ^I
notasi caret (tab disimpan sebagai byte yang menyimpan nilai 9, dan I
di ASCII adalah 64+9=73):
$ cat -t felidae.txt
Felidae \Felidae\ n.^M
^Ia natural family of lithe-bodied round-headed fissiped^M
^Imammals, including the cats; wildcats; lions; leopards;^M
^Icheetahs; and saber-toothed tigers.^M
^M
^ISyn: family {Felidae}.^M
^I^I [WordNet 1.5]^M
-et
:tampilkan semua karakter tersembunyi
Seperti yang telah saya sebutkan secara singkat, jika Anda ingin menampilkan semua karakter non-cetak, termasuk tabulasi dan penanda akhir baris, Anda harus menggunakan keduanya -e
dan -t
pilihan:
$ cat -et felidae.txt
$
Felidae \Felidae\ n.^M$
^Ia natural family of lithe-bodied round-headed fissiped^M$
^Imammals, including the cats; wildcats; lions; leopards;^M$
^Icheetahs; and saber-toothed tigers.^M$
^M$
^ISyn: family {Felidae}.^M$
^I^I [WordNet 1.5]^M$
$
Bonus:Penggunaan perintah cat yang tidak berguna di Linux
Tidak ada artikel tentang cat
perintah akan lengkap tanpa menyebutkan anti-pola "Penggunaan Kucing yang Tidak Berguna".
Itu terjadi ketika Anda menggunakan cat
untuk satu-satunya tujuan mengirim konten file ke input standar dari perintah lain. Itu penggunaan cat
perintah dikatakan "tidak berguna" karena pengalihan sederhana atau parameter nama file akan melakukan pekerjaan itu, dan akan melakukannya dengan lebih baik. Tapi sebuah contoh bernilai seribu kata:
$ curl -so - dict://dict.org/'d:uuoc:jargon' | sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > uuoc.txt
$ cat uuoc.txt | less
UUOC
[from the comp.unix.shell group on Usenet] Stands for Useless Use of {cat};
the reference is to the Unix command cat(1), not the feline animal. As
received wisdom on comp.unix.shell observes, ?The purpose of cat is to
concatenate (or ?catenate?) files. If it's only one file, concatenating it
with nothing at all is a waste of time, and costs you a process.?
Nevertheless one sees people doing
cat file | some_command and its args ...
instead of the equivalent and cheaper
<file some_command and its args ...
or (equivalently and more classically)
some_command and its args ... <file
[...]
Pada contoh di atas, saya menggunakan pipeline untuk menampilkan konten uuoc.txt
file dengan less
halaman:
cat uuoc.txt | less
Jadi, satu-satunya tujuan cat
perintah adalah untuk memberi makan input standar dari less
perintah dengan konten uuoc.txt
mengajukan. Saya akan mendapatkan perilaku yang sama menggunakan pengalihan Shell:
less < uuoc.txt
Faktanya, less
perintah, seperti banyak perintah, juga menerima nama file sebagai argumen. Jadi saya bisa saja menulisnya sebagai gantinya:
less uuoc.txt
Seperti yang Anda lihat, tidak perlu cat
di sini. Jika saya menyebutkan anti-pola "Penggunaan Kucing yang Tidak Berguna", ini karena, jika Anda menggunakannya secara publik di forum atau di tempat lain, tidak diragukan lagi seseorang akan menunjukkan kepada Anda dengan argumen bahwa Anda akan membuat "proses ekstra tanpa biaya. ”
Saya harus mengakui untuk waktu yang lama saya cukup meremehkan dengan komentar seperti itu. Lagi pula, pada perangkat keras modern kami, menghasilkan satu proses tambahan untuk operasi satu kali tidak dapat menyebabkan banyak overhead.
Tapi saat menulis artikel ini, saya melakukan eksperimen cepat, membandingkan waktu yang dibutuhkan dengan dan tanpa UUOC dengan uji awk
skrip untuk memproses 500MB data yang berasal dari media yang lambat.
Yang mengejutkan saya, perbedaannya jauh dari dapat diabaikan:
Namun, alasannya bukan tentang proses ekstra yang dibuat. Tetapi karena pembacaan/penulisan ekstra dan pengalihan konteks yang ditimbulkan UUOC (seperti yang dapat Anda simpulkan dari waktu yang dihabiskan untuk mengeksekusi kode sistem). Jadi memang, ketika Anda bekerja pada kumpulan data besar yang ekstra cat
perintah memiliki biaya yang tidak dapat diabaikan. Sedangkan untuk diriku sendiri, aku akan mencoba untuk lebih waspada dengan itu sekarang! Dan kau? Jika Anda memiliki contoh Penggunaan Cat yang Tidak Berguna, jangan ragu untuk membagikannya kepada kami!