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


58

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


回答:


82

1つの方法は使用することcutです:

 command | cut -c1-8

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


3
cut -c文字を選択することに注意してください。cut -bまたはhead -cバイトを選択します。これにより、一部のロケールで違いが生じます(実際には、UTF-8を使用する場合)。
ジル 'SO-悪であるのをやめる'

この場合、開始インデックスを指定する必要もありません。言っcut -c-88に文字1から選択されます
Sparhawk

@ Steven、cutWindowsでの同等のものは?
Pacerier

またcommand | dd bs=8 count=1 2>/dev/null。それが短いまたは優れていると言っていない。ちょうど別の選択肢。
-dubiousjim

@Gilles、ただし、GNUの現在のバージョンでは次のようcutcut -c動作することに注意してくださいcut -b(つまり、マルチバイト文字に対しては正しく動作しません)。
ステファンシャゼラス

24

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

command | head -c8

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

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

そして、あなたがbashを持っている場合

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

2
次のsed定式化は少し読みやすいと思います:command | sed 's/\(.\{8\}\).*/\1/'または、sedがそれをサポートしている場合:command | sed -r 's/(.{8}).*/\1/'; それ以外の場合、+ 1
スティーブンD

良いものですが、文字ではなくバイトhead -c数えることに注意してください。同様に、主要なAwk実装の中で、GNU awk のみがマルチバイト文字を正しく処理します-FreeBSD AwkとMawkは正しく処理しません。
mklement0

2

十分に高度なシェルを使用している場合(たとえば、以下はBashで機能しますが、ダッシュについてはわかりません)、次のことができます。

read -n8 -d$'\0' -r <(command)

実行後read ... <(command)、キャラクターはシェル変数に入れられますREPLY。入力help readして、他のオプションについて学習します。

説明:への-n8引数readは、最大8文字が必要であることを示しています。ザ・は-d$'\0'ヌルまでではなく、改行を読み語ります。この方法では、以前の文字の1つが改行であっても、その文字がNULLでない場合でも、8文字の間読み取りが続行されます。代わりに-n8 -d$'\0'、を使用して-N8、正確に8文字を読み取るか、stdinがEOFに達するまで読み取ります。区切り文字は使用されません。それはおそらく、もっと自分のニーズに合った、私は名誉読んだぶっきらぼうどのように多くのシェルがわからない-N敬うとは対照的に、-nそしてを-d。説明を続けます:-escapesを-r無視し\ます。たとえば、\\単一の文字としてではなく、2つの文字として扱い\ます。

最後に、我々はやるread ... <(command)のではなくcommand | read ...ので、二番目の形式で、読み取りはあなただけ読んで情報を失う、その直後に終了しサブシェルで実行されます。

別のオプションは、サブシェル内ですべての処理を実行することです。例えば:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>

1
8文字を出力するだけで、シェルで処理する必要がない場合は、を使用しますcut
-dubiousjim

知っておくと良いread -n <num>。小さな警告:Bash 3.x(OSの現在)は誤っ<num>バイトカウントとして解釈するため、マルチバイト文字で失敗します。これはBash 4.xで修正されました。
mklement0

これは非常に便利な答えです。他のものよりもはるかに一般的です。
not2qubit

2

パラメーター拡張を使用したもう1つのライナーソリューション

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

またx=8; echo ${word:0:$x}、整数をハードコーディングする代わりに、長さを保持する変数を使用することもできます。
Cometsong


0

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

command | xxd -l$BYTES | xxd -r

の出力が短く$BYTESなければ、正確にそのバイトcommandを出力します。


別の方法が離陸するcutの末尾の改行をにそれをピップすることです:| tr -d '\n'
Cometsong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.