Bir komuttan çok uzun bir çıktı alırsam (tek satır) ancak çıktının yalnızca ilk [x] (8 diyelim) karakterini istediğimi biliyorum, bunu elde etmenin en kolay yolu nedir? Sınırlayıcı yok.
Bir komuttan çok uzun bir çıktı alırsam (tek satır) ancak çıktının yalnızca ilk [x] (8 diyelim) karakterini istediğimi biliyorum, bunu elde etmenin en kolay yolu nedir? Sınırlayıcı yok.
Yanıtlar:
Bir yol kullanmaktır cut
:
command | cut -c1-8
Bu size her çıktı satırının ilk 8 karakterini verecektir. Yana cut
POSIX'e bir parçası, en Unix'lerde olması muhtemeldir.
cut -c
Karakterleri seçtiğini unutmayın ; cut -b
veya head -c
baytları seçer. Bu, bazı yerel ayarlarda fark yaratır (pratikte UTF-8 kullanırken).
cut -c-8
1 ile 8 arasındaki karakterleri seçecektir.
cut
Windows'taki eşdeğeri?
command | dd bs=8 count=1 2>/dev/null
. Daha kısa ya da üstün olduğunu söylemiyorum. Sadece başka bir alternatif.
cut
, cut -c
gibi çalışır cut -b
(yani, çoklu bayt karakterler için düzgün çalışmıyor).
Bunlar sadece ilk 8 karaktere ulaşmanın başka yolları.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
Ve eğer bash varsa
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
ya da sed'iniz destekliyorsa command | sed -r 's/(.{8}).*/\1/'
:; Aksi takdirde, +1
head -c
sayan not . Benzer şekilde, başlıca Awk uygulamaları arasında, yalnızca GNU awk çoklu bayt karakterlerini doğru şekilde işler - FreeBSD Awk ve Mawk yoktur.
Yeterince gelişmiş bir kabuğunuz varsa (örneğin, aşağıdakiler, çizgi üzerinde emin değil Bash'te çalışır), şunları yapabilirsiniz:
read -n8 -d$'\0' -r <(command)
Çalıştırdıktan sonra read ... <(command)
karakterleriniz kabuk değişkeninde olacaktır REPLY
. Tip help read
diğer seçenekler hakkında bilgi edinmek için.
Açıklama: -n8
Argüman read
8 karaktere kadar istediğimizi söylüyor. -d$'\0'
Bir boş dek yerine bir satır okunduğu diyor. Bu yolla, önceki karakterlerden biri yeni satır olsa bile 8 karakter devam eder (ancak boş değilse). Alternatif olarak -n8 -d$'\0'
, -N8
tam 8 karakter okuyan veya stdin EOF'a ulaşana kadar kullanmaktır. Hiçbir sınırlayıcı onurlandırılmaz. Muhtemelen ihtiyaçlarınızı daha iyi uyuyor, ama ben onur bir okuma var hazırlıksız kaç kabukları bilmiyorum -N
onurlandıran aksine -n
ve -d
. Açıklamaya devam etmek: -r
yoksaymak \
-escapes diyor , böylece, örneğin, \\
tek bir karakter yerine iki karakter gibi davranıyoruz \
.
Son olarak, yaptığımız read ... <(command)
ziyade command | read ...
çünkü ikinci formda, okuma sadece okumak bilgileri kaybetmeden, daha sonra hemen çıkılır bir kabuktaki yürütülür.
Başka bir seçenek de tüm işlemlerinizi deniz kabuğunun içerisinde yapmaktır. Örneğin:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
.
read -n <num>
; küçük uyarı: Bash 3.x (işletim sistemi üzerinde hala güncel olan) yanlışlıkla <num>
bir bayt sayısı olarak yorumlanır ve bu nedenle çok baytlık karakterlerle başarısız olur; bu, Bash 4.x'te düzeltildi.
Parametre genişletme kullanarak başka bir liner çözümü
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}
tamsayıyı kodlamak yerine.
Bu taşınabilir:
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
Değişken uzunlukta bir karakter dizisi oluşturmak için burada kendi soru var .
Ben maven deposunda checksum dosyaları el ile oluştururken bu sorunu yaşadım. Ne yazık ki, cut -c
her zaman çıktı sonunda yeni bir satır yazdırır. Kullandığımı bastırmak için xxd
:
command | xxd -l$BYTES | xxd -r
Çıktı kısalmazsa, tam olarak bu çıktısı alır, tam olarak $BYTES
bayt command
çıkarır.
cut
yetişemiyeceği yeni satır içine pip için:| tr -d '\n'