web-dev-qa-db-ja.com

catコマンドから最初のX文字を取得しますか?

シェルスクリプトの変数に出力しているテキストファイルがあります。ただし、必要なのは最初の50文字だけです。

cat ${filename} cut -c1-50を使用してみましたが、最初の50文字をはるかに超えていますか?これは、cutが行を探す(100%確実ではない)ためかもしれませんが、このテキストファイルは1つの長い文字列である可能性があります。

catコマンドから最初のX文字を取得するためにパイプで接続できるユーティリティはありますか?

51
jkj2000
head -c 50 file

これは最初の50バイトを返します。

コマンドがすべてのOSで常に同じように実装されているわけではないことに注意してください。 LinuxおよびmacOSでは、このように動作します。 Solaris(11)では、/ usr/gnu/bin /にあるgnuバージョンを使用する必要があります

71
DisplayName

cutコマンドは、パイプを使用してデータを渡す場合に機能します。

cat ${file} | cut -c1-50 

または、猫の無用な使用を避けて少し安全にする:

cut -c1-50 < "$file"

上記のコマンドは、最初の50文字(またはcutの実装に応じてバイト)を出力することに注意してください各入力行の。あなたが言うように、あなたのファイルが1つの巨大な行であるならば、それはあなたが期待することをするはずです。

31
terdon
dd status=none bs=1 count=50 if=${filename}

これは最初の50バイトを返します。

8
doneal24

これまでのほとんどの回答は、1バイト= 1文字であると想定しています。これは、ASCII以外のロケールを使用している場合には当てはまらない場合があります。

それを行うためのもう少し堅牢な方法:

testString=$(head -c 200 < "${filename}") &&
  printf '%s\n' "${testString:0:50}"

これは次のことを前提としています。

  1. ksh93bash(または最近のzshまたはmkshを使用しています(mkshでサポートされているマルチバイト文字セットはUTFのみですが) -8およびset -o utf8-mode)の後にのみ)およびheadをサポートするバージョンの-cをサポートします(最近ではほとんどがサポートされていますが、厳密には標準ではありません)。
  2. 現在のロケールはファイルと同じエンコーディングに設定されます(確認するには、locale charmapおよびfile -- "$filename"と入力します);そうでない場合は、ieで設定します。 LC_ALL=en_US.UTF-8
  3. すべての文字が最大4バイトでエンコードされる最悪の場合のUTF-8を想定して、headでファイルの最初の200バイトを取得しました。これは私が考えることができるほとんどのケースをカバーするはずです。
5
Calimo
grep -om1 "^.\{50\}" ${filename}

その他のバリアント(ファイルの最初の行)

(IFS= read -r line <${filename}; echo ${line:0:50})
2
Costas

1. ASCIIファイルの場合、@ DisplayNameが言うように してください:

head -c 50 file.txt

たとえば、file.txtの最初の50文字が出力されます。

2.バイナリデータの場合、hexdumpを使用して、16進文字として出力します。

hexdump -n 50 -v file.bin

たとえば、file.binの最初の50バイトを出力します。

-v verboseオプションを使用しない場合、hexdumpは繰り返し行をアスタリスク(*)に置き換えます。こちらをご覧ください: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613

1
Gabriel Staples