コマンド(単一行)からの出力が本当に長いのに、出力の最初の[x](たとえば8文字)だけが必要だとわかっている場合、それを取得する最も簡単な方法は何ですか?区切り文字はありません。
1つの方法は、cut
を使用することです。
command | cut -c1-8
これにより、出力の各行の最初の8文字が得られます。 cut
はPOSIXの一部であるため、ほとんどのUnicesで使用される可能性があります。
これらは、最初の8文字のみを取得する他の方法です。
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
そして、もしあなたがバッシュを持っているなら
var=$(command)
echo ${var:0:8}
パラメータ展開 を使用した別のワンライナーソリューション
echo ${Word:0:x}
EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3}
o/p: Hel
EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
十分に高度なシェルを使用している場合(たとえば、次はBashで機能しますが、ダッシュについては不明です)、次のことができます。
_read -n8 -d$'\0' -r <(command)
_
read ... <(command)
を実行すると、キャラクターはシェル変数REPLY
に格納されます。他のオプションについては、_help read
_と入力してください。
説明:read
への_-n8
_引数は、最大8文字が必要であることを示しています。 _-d$'\0'
_は、改行ではなくnullになるまで読み取ると言います。このようにして、以前の文字の1つが改行であっても(ただし、ヌルの場合は)、8文字の読み取りが続行されます。 _-n8 -d$'\0'
_の代わりに、_-N8
_を使用することができます。これは、正確に8文字を読み取るか、stdinがEOFに達するまで読み取ります。区切り文字は使用されません。それはおそらくあなたのニーズによりよく適合しますが、_-N
_と_-n
_を尊重するのではなく、_-d
_を尊重する読み取りをシェルがいくつ持っているかはわかりません。説明を続けると、_-r
_は無視_\
_- escapesと表示されるため、たとえば、_\\
_を単一の_\
_ではなく2文字として扱います。
最後に、_command | read ...
_ではなくread ... <(command)
を実行します。2番目の形式では、読み取りがサブシェルで実行され、すぐに終了して、読み取った情報が失われるためです。
別のオプションは、すべての処理をサブシェル内で実行することです。例えば:
_$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
_
これは移植可能です:
a="$(command)" # Get the output of the command.
b="????" # as many ? as characters are needed.
echo ${a%"${a#${b}}"} # select that many chars from $a
可変長の文字列を作成するには ここでの独自の質問 があります。
Mavenリポジトリでチェックサムファイルを手動で生成するときにこの問題が発生しました。残念ながらcut -c
は常に出力の最後に改行を出力します。これを抑制するには、xxd
を使用します。
command | xxd -l$BYTES | xxd -r
command
の出力が短い場合を除いて、正確に$BYTES
バイトを出力し、正確にその出力を出力します。