先週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
コマンドには無視できないコストがかかります。私自身は、これからもっと警戒していきたいと思います!あなたも?猫の役に立たない使用例がある場合は、遠慮なく共有してください!