web-dev-qa-db-ja.com

ファイルの内容を標準出力に出力するコマンド?

catがこれを実行できることはわかっていますが、その主な目的は、コンテンツを表示するだけではなく連結することです。

lessmoreについても知っていますが、ファイルの内容をターミナルに出力するだけの簡単な(ページャーではない)を探しています。そういうものがあったら、これのために特別に作られました。

30
confused00

最も明白なのはcatです。ただし、headtailも確認してください。ファイルを1行ずつ印刷する他のシェルユーティリティもあります:sedawkgrep。しかし、それらはファイルの内容を変更したり、ファイル内を検索するためのものです。

私はいくつかのテストを行って、どれが最も効果的なものかを見積もりました。私はすべてのトラフstraceを実行して、システムコールが最も少ないものを確認しました。私のファイルには1275行あります。

  • awk:1355システムコール
  • cat:51システムコール
  • grep:1337システムコール
  • head:93システムコール
  • tail:130システムコール
  • sed:1378システムコール

ご覧のように、catはファイルを連結するように設計されていても、最速で最も効果的なファイルです。 sedawkおよびgrepは、ファイルを1行ずつ出力したため、1275を超えるシステムコールが発生します。

40
chaos

catがこれを実行できることはわかっていますが、その主な目的は、コンテンツを表示するだけではなく連結することです。

catの目的はまさにそれであり、ファイルを読み取ってstdoutに出力します。

22
Jan

zshの下で

<file

ファイルを印刷する最も短い方法だと思います。 'hidden' cat(またはstdoutがターミナルの場合はmore)を使用しますが、印刷に使用されるコマンドはREADNULLCMD変数によって制御され、コマンドで直接上書きしても安全です名前、または関数によって。たとえば、行番号の付いたファイルを印刷するには、次のようにします。

numcat() { nl -s'> ' -w2 - }
READNULLCMD=numcat
<file
7
jimmij

私はこれが過去形の質問であることを知っています。技術的には、ファイルの内容をstdoutに出力することは連結の形式であるため、catが意味的に適切です。 printfは意味的にデータのフォーマットと印刷を目的としていることを忘れないでください。 Bashは、ファイルからの入力と出力をリダイレクトする構文も提供します。これらの組み合わせはこれを生成するかもしれません:

printf '%s' "$(<file.txt)"
5
James M. Lay

POSIXは cat を次のように定義します:

[〜#〜]名前[〜#〜]

cat-ファイルを連結して印刷する

[〜#〜] synopsis [〜#〜]

猫[-u] [ファイル...]

[〜#〜]説明[〜#〜]

Catユーティリティは、ファイルを順番に読み取り、その内容を同じ順序で標準出力に書き込みます。

したがって、ここではconcatenateファイルを順番に読み取ることを意味すると思います。

5
cuonglm

bashビルトインを使用してサブプロセスの作成を回避する:

{ while IFS='' read -rd '' _bcat_; do printf '%s\0' "${_bcat_}"; done; printf '%s' "${_bcat_}"; unset _bcat_; } <'/path/to/file'

IFSreadコマンドにのみ適用されるため、グローバルなIFSの変更を心配する必要はありません。

Null文字の処理にはループが必要です(StéphaneChazelasに感謝)。

ファイルの内容が最初に変数(つまりメモリ)に読み込まれるため、この方法は大きなファイルには適していません。ところで、私はこの方法で39Mのテキストファイルを印刷しようとしましたが、bashのメモリ使用量は5Mを超えていなかったため、このケースについては不明です。

また、速度が遅く、CPUが非効率的です。同じ39Mファイルの場合、シングルコアの使用率が100%で約3分かかりました。

大きなファイルまたはバイナリの場合、cat '/path/to/file' あるいは dd if='/path/to/file' bs=1M 可能なら。

4
Mikhail

デモンストレーションと同じように、

cp foo /dev/stdout
2
wisbucky