GNU/Linux >> Belajar Linux >  >> Linux

Perintah Cat di Linux:Contoh Esensial dan Lanjutan

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!


Linux
  1. Perintah Linux Cat:Penggunaan dan Contohnya

  2. Perintah Linux - Gambaran Umum dan Contoh

  3. Contoh Perintah Cat Penting di Linux

  1. Bagaimana Cara Menyalin File di Linux dan Unix? Contoh Perintah 10 cp

  2. 10 Contoh Perintah Cat untuk Mengelola File di Linux / UNIX

  3. Contoh Perintah mkdir dan rmdir di Linux

  1. Perintah mv di Linux:7 Contoh Penting

  2. Contoh Penting dari Perintah File di Linux

  3. contoh Perintah swapon dan swapoff di Linux