回答:
head
も動作します:
head -c 100 file # returns the first 100 bytes in the file
..最初の100バイトを抽出して返します。
これを使用head
することの良い点は、tail
一致の構文があることです。
tail -c 100 file # returns the last 100 bytes in the file
これらを組み合わせてバイトの範囲を取得できます。たとえば、ファイルから2番目の 100バイトを取得するには、最初の200バイトを読み取り、head
tailを使用して最後の100 バイトを取得します。
head -c 200 file | tail -c 100
head
で読み取り、次に使用tail
して最後の10 バイトを取得します。例:head -c 20 file | tail -c 10
ddを使用して、バイトの任意のチャンクを抽出できます。
例えば、
dd skip=1234 count=5 bs=1
バイト1235から1239をその入力から出力にコピーし、残りを破棄します。
標準入力から最初の5バイトを取得するには、次のようにします。
dd count=5 bs=1
入力ファイル名を指定したい場合、ddには古い形式の引数解析があるので、次のようにします。
dd count=5 bs=1 if=filename
また、ddはそれが何をしたかを詳細に発表するので、それを捨てるには、次のようにします。
dd count=5 bs=1 2>&-
または
dd count=5 bs=1 2>/dev/null
dd bs=1
ddは一度に1つの文字を読み書きするのでhead
、countが大きい場合よりもはるかに遅いため、このソリューション一般にはお勧めしません。ただし、count = 5では目立ちません。
dd
。
head -c
実装せずにbusyboxの命の恩人でしたdd bs=5 count=1
行をgrepしてから、たとえば次のようにカットすることもできます。
grep 'text'ファイル名| カット-c 1-5
答えは6年前に尋ねられた質問への返信であることを知っています...
しかし、私は数時間同じようなものを探していて、それを発見しました 。cut-cはそれを正確に実行し、オフセットを指定することもできます。
cut -c 1-5はHelloを返し、cut -c 7-11はworldを返します。他のコマンドは必要ありません
これは数年前に回答/承認されましたが、現在承認されている回答は、iso-8859-1のような文字ごとの1バイトエンコーディング、または可変バイト文字セット(ラテン文字など)のシングルバイトサブセットに対してのみ正しいです。 UTF-8内)。代わりにマルチバイトスプライスを使用しても、UTF-16のような固定マルチバイトエンコーディングでのみ機能します。現在、UTF-8は一般的な標準になりつつあり、ネイティブスピーカーの数によるこの言語のリストと、ネイティブ/セカンダリの使用法による上位30言語のリストを見ると、次の点を指摘することが重要です。単純な変数バイト文字に優しい(バイトベースではない)技術を用いてcut -c
およびtr
/ sed
文字クラスとします。
バイトと文字の問題に関するラテン語を中心とした2つの一般的な間違い/推測のために二重に失敗する次のものを比較します(1つは head
vs. cut
、は[a-z][A-Z]
vs [:upper:][:lower:]
)。
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
これに(注:これはFreeBSDではうまくいきましたが、両方とも cut
&tr
GNU / Linux上でまだ台無しギリシャUTF-8での私のためにかかわらず):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
別のより最近の回答ではすでに「カット」が提案されていましたが、これは任意のオフセットを指定するために使用できるという副次的な問題のためであり、直接関連する文字とバイトの問題のためではありません。
もしあなたの cut
-c
が可変バイトエンコーディングを正しく処理しないは、「最初のX
文字」(X
数値で置き換える)を試すことができます。
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
-最初の行に限定されますがhead -n 1 | grep -E -o '^.{X}'
-これは最初の行に限定され、2つのコマンドをチェーンしますがdd
-すでに他の回答で提案されていますが、本当に面倒ですsed
複数行にまたがる文字を処理するためのスライディングウィンドウバッファーを備えた複雑なスクリプトですが、それはおそらく次のようなものを使用するよりも扱いにくい/壊れやすいです。dd
tr
可変バイトエンコーディングで文字クラスを正しく処理しない場合は、次のことを試してください。
sed -E -e 's/[[:upper:]]/\L&/g
(GNU固有)printf 'Πού ' | cut -c 1
次に、ここで説明したdd
アプローチを使用してラップする簡単なスクリプトを示します。
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
消費もし" world\n"
ます。