GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでのCatコマンド:基本的な例と高度な例

先週lsコマンドで開始されたあまり知られていないコマンドのツアーを続けて、今日は catを調べてみましょう。 コマンド。

cat nameはcatenateの略です そのコマンドの主な仕事は、標準出力でコンテンツを順番に送信することにより、複数の入力ファイルを結合することです。

# 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

その連結の結果をファイルに保存する場合は、シェルリダイレクトを使用する必要があります:

cat felidae.txt felis.txt > result.txt
cat result.txt

その主な設計目標がファイルを連結することである場合でも、 cat ユーティリティは、上記の例の最後の行で行ったのとまったく同じように、そのファイルのコンテンツを画面に表示するために1つの引数だけで使用されることもよくあります。

A。標準入力でのcatコマンドの使用

引数なしで使用すると、 cat コマンドは、標準入力からデータを読み取り、それらを標準出力に書き込みます。これは、データを変換するためのオプションを使用していない限り、ほとんど役に立ちません。いくつかの興味深いオプションについては後で説明します。

ファイルパスに加えて、 cat コマンドは-も理解します 標準入力のエイリアスとしての特別なファイル名。このようにして、標準入力から読み取ったデータを、コマンドラインで指定されたファイルの間に挿入できます。

# Insert a separator between the two concatenated files
echo '----' | cat felis.txt - felidae.txt

B。バイナリファイルでのcatコマンドの使用

1。分割ファイルの結合

cat コマンドはファイルの内容について何も想定していないため、バイナリデータで問題なく機能します。 splitによって壊れたファイルを再結合するのに役立つかもしれない何か またはcsplit 指図。または、今から行うように部分的なダウンロードに参加するには:

#
# 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

これで、画像の半分が2つになりました。 ImageMagickのdisplayを使用して、前半を開いて「壊れている」ことを確認できます。 、または gimp 、または画像ファイルを読み取ることができるその他のソフトウェア:

display first-half
# -or-
gimp first-half
# -or-
firefox first-half

curlを勉強する場合 私が使用したコマンドでは、2つの部分が完全に補完的であることがわかります。前半はバイト0から50000までで、後半はバイト50001からファイルの終わりまでです。それらの間に欠測データがあってはなりません。したがって、ファイル全体を取得するには、2つの部分を(正しい順序で)連結するだけで済みます。

cat first-half second-half > image.jpg
display image.jpg

2。ストリーミング可能なファイル形式の操作

catを使用できるだけではありません いくつかの部分に分割されたバイナリファイルを「再結合」するコマンドですが、場合によっては、 newを作成することもできます。 そのようにファイルします。これは、MPEGトランスポートストリームビデオファイル( .TS などの「ヘッダーレス」または「ストリーミング可能」ファイル形式で特にうまく機能します。 ファイル):

# 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

これで、 cat を使用して、これらすべてのトランスポートストリームビデオファイルを組み合わせることができます。 コマンド、出力で完全に有効なTSファイルを取得します:

cat fadein.ts still.ts fadeout.ts > video.ts
mplayer video.ts

TSファイル形式のおかげで、これらのファイルを希望の順序で組み合わせることができ、引数リストで同じファイルを数回使用して、出力ビデオにループまたは繰り返しを作成することもできます。もちろん、アニメーション画像を使用する場合はもっと楽しいでしょうが、自分でそれを行うことができます。多くの民生用デバイスはTSファイルを記録しますが、記録しない場合でも、ffmpeg ほとんどすべてのビデオファイルをトランスポートストリームファイルに変換します。コメントセクションを使用して、作成したものを共有することを躊躇しないでください!

3。 cpioアーカイブのハッキング

最後の例として、 catの使用方法を見てみましょう。 複数のcpioを組み合わせるコマンド アーカイブ。ただし、今回は、 cpio に関する知識が少し必要になるため、それほど単純ではありません。 アーカイブファイル形式。

cpio アーカイブはファイルのメタデータとコンテンツを順番に保存するため、 catとのファイルレベルの連結に適しています。 効用。残念ながら、 cpio アーカイブには、アーカイブの終わりを示すために使用される予告編も含まれています:

# 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

良い新機能は、cpioバイナリアーカイブでは、トレーラーの長さが280バイトに固定されていることです。したがって、 headを使用します 標準コマンドです。簡単に削除できます:

# 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。重要な猫のコマンドオプション

さまざまなバイナリファイル形式で遊んだ後、それらのファイルを処理するために特別に調整されたいくつかのオプションを調べて、今度はプレーンな古いテキストファイルに戻りましょう。 POSIX標準の一部ではありませんが、これらのオプションはBSDおよびGNU cat間で移植可能です。 実装。ここでは網羅的なふりをしていないことに注意してください。manを確認してください。 catでサポートされているオプションの完全なリストを表示するには システム上で!

-n :数直線

nを使用 オプション、 cat コマンドは、各出力行の前に行番号を付けます:

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 オプション番号出力 行。つまり、カウンターはではありません 次のコマンドを自分で試してみるとわかるように、ある入力ファイルから次の入力ファイルに切り替えるときにリセットします。

cat -n feli*.txt

-s :繰り返される空の出力行を抑制します

-sを使用 オプション、 cat コマンドは、複数の連続する空の行を1つだけで折りたたむ:

 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;

上記の例では、デフォルトの出力で、10行目と11行目が空であることがわかります。 -sを追加する場合 オプションの場合、2番目の空の行は破棄されました。

-b :空でない行のみに番号を付ける

上記の2つのオプション、 -bにある程度関連しています オプションは行に番号を付けますが、空の行は無視します:

$ 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

上記の例では、 catの2つのインスタンスを使用しています パイプライン内のさまざまなオプションを使用したコマンド。内側の番号は-bに由来します 最初のcatで使用されるオプション 指図。外側の番号は-nに由来します 2番目のcatで使用されるオプション 。

ご覧のとおり、最初と最後の行は ではありませんでした -bによって番号が付けられます それらが空であるため、オプション。しかし、6行目はどうですか?なぜまだ-bで番号が付けられているのですか オプション?ええと、それは空白だからです 行-ただし、ではありません 1つは、次のセクションで説明します。

-v -e -t :印刷されない文字を表示する

3つのオプション-v -e `、および` -t 非表示の文字のさまざまなセットを表示するために使用されます。セットが重複している場合でも、「キャッチオール」オプションはないため、 all を表示する場合は、セットを組み合わせる必要があります。 見えない文字。

-v :非表示の文字を表示

-v オプションは、キャレットとメタ表記ですべての非印刷文字を表示します。 を除く 改行と集計。

このオプションを使用すると、制御文字はキャレットとして表示されます( ^ )の後に適切なASCII文字が続きます(たとえば、キャリッジリターンのバイト13は、 ^ Mとして表示されます。 M ASCIIでは64+13)であり、上位ビットが設定された文字は「メタ」表記M-で表示されます。 その後に、下位7ビットに対応する表現が続きます(たとえば、バイト141は M- ^ Mとして表示されます。 141は128+13であるため)。

一見難解に見えますが、この機能は、たとえば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 (

-vの別の使用例 オプションは、テキストファイルにリークした可能性のある制御文字を見つけることです。覚えていると思いますが、上記の -bには奇妙な問題があります。 6番目の入力行に番号を付けるオプション。見た目 それが空だったように。それでは、それを調査しましょう:

$ 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

ああああ!それらの^Mが見えますか マーク?これらは、他の方法では表示されないキャリッジリターン文字を置き換えるために使用されます。それはどこから来たのか?さて、 dict プロトコルは、他のインターネットプロトコルと同様に、ラインターミネータとしてCRLFを使用しています。そこで、サンプルファイルの一部としてダウンロードしました。改行とキャリッジリターンの詳細については、 foldをご覧ください。 およびfmt 記事。しかし今のところ、 catの理由を説明しています 6行目は空ではないと見なされました。

-e :行末を含む非表示の文字を表示する

-e オプションは-vのように機能します オプション。ただし、ドル記号( $ も追加されます) )各改行文字の前にあるため、行末が明示的に表示されます:

$ 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 :タブを含む非表示の文字を表示する

-t オプションは-vのように機能します オプション。ただし、 ^ Iを使用して表も表示されます。 キャレット記法(タブは値9を保持するバイトとして格納され、 I ASCIIでは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 :すべての非表示の文字を表示する

すでに簡単に述べたように、表と行末マーカーの両方を含むすべての非印刷文字を表示する場合は、 -eの両方を使用する必要があります。 および-t オプション:

$ 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$
$

ボーナス:Linuxでのcatコマンドの無用な使用

catに関する記事はありません コマンドは、「猫の役に立たない使用」アンチパターンについて言及しなくても完了します。

catを使用すると発生します ファイルの内容を別のコマンドの標準入力に送信することのみを目的としています。 catの使用 単純なリダイレクトまたはファイル名パラメーターがその仕事をし、それをより良くしたので、コマンドは「役に立たない」と言われます。しかし、千の言葉に値する例:

$ 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
[...]

上記の例では、パイプラインを使用して uuoc.txtのコンテンツを表示しました lessのファイル ポケットベル:

cat uuoc.txt | less

したがって、 catの唯一の目的は コマンドは、 lessの標準入力をフィードすることでした uuoc.txtの内容を含むコマンド ファイル。シェルリダイレクトを使用して同じ動作を取得したはずです:

less < uuoc.txt

実際のところ、 less コマンドは、多くのコマンドと同様に、引数としてファイル名も受け入れます。だから私は代わりにそれを簡単に書くことができたでしょう:

less uuoc.txt

ご覧のとおり、 catは必要ありません ここ。 「猫の役に立たない使用」のアンチパターンについて言及すると、これは、フォーラムやその他の場所で公に使用すると、間違いなく誰かがあなたに「余分なプロセスを無料で作成する」という議論で指摘するからです。 」

私は長い間、そのようなコメントにかなり否定的だったことを認めなければなりません。結局のところ、最新のハードウェアでは、ワンショット操作のために1つの追加プロセスを生成しても、それほど多くのオーバーヘッドは発生しませんでした。

しかし、この記事を書いている間、私は簡単な実験を行い、テスト awkによってUUOCがある場合とない場合に必要な時間を比較しました。 低速メディアからの500MBのデータを処理するスクリプト。

驚いたことに、その違いは無視できるほどではありませんでした:

ただし、その理由は、追加のプロセスが作成されることではありません。ただし、余分な読み取り/書き込みとコンテキストの切り替えのために、UUOCが発生します(システムコードの実行に費やした時間から推測できるため)。したがって、実際、大規模なデータセットで作業する場合は、 cat コマンドには無視できないコストがかかります。私自身は、これからもっと警戒していきたいと思います!あなたも?猫の役に立たない使用例がある場合は、遠慮なく共有してください!


Linux
  1. Linuxでのmvコマンド:7つの重要な例

  2. Linuxでのファイルコマンドの基本的な例

  3. Linux での mkdir および rmdir コマンドの例

  1. Linuxコマンド-概要と例

  2. Linux での swapon および swapoff コマンドの例

  3. Linux での diff コマンドの例

  1. Linux Catコマンド:使用法と例

  2. Linuxでの重要なCatコマンドの例

  3. Linuxでのrsyncコマンドの実用例