web-dev-qa-db-ja.com

パイプから文字列の最初の[x]文字を取得する

コマンド(単一行)からの出力が本当に長いのに、出力の最初の[x](たとえば8文字)だけが必要だとわかっている場合、それを取得する最も簡単な方法は何ですか?区切り文字はありません。

67
xenoterracide

1つの方法は、cutを使用することです。

 command | cut -c1-8

これにより、出力の各行の最初の8文字が得られます。 cutはPOSIXの一部であるため、ほとんどのUnicesで使用される可能性があります。

95
Steven D

これらは、最初の8文字のみを取得する他の方法です。

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

そして、もしあなたがバッシュを持っているなら

var=$(command)
echo ${var:0:8}
26
user1606

パラメータ展開 を使用した別のワンライナーソリューション

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
2

十分に高度なシェルを使用している場合(たとえば、次は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>
_
2
dubiousjim

これは移植可能です:

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

可変長の文字列を作成するには ここでの独自の質問 があります。

1
user79743

Mavenリポジトリでチェックサムファイルを手動で生成するときにこの問題が発生しました。残念ながらcut -cは常に出力の最後に改行を出力します。これを抑制するには、xxdを使用します。

command | xxd -l$BYTES | xxd -r

commandの出力が短い場合を除いて、正確に$BYTESバイトを出力し、正確にその出力を出力します。