หากฉันมีเอาต์พุตที่ยาวมากจากคำสั่ง (บรรทัดเดียว) แต่ฉันรู้ว่าฉันต้องการเพียงแค่ [x] (สมมติว่า 8) ตัวอักษรของเอาต์พุตเป็นวิธีที่ง่ายที่สุดในการรับสิ่งนั้น ไม่มีตัวคั่นใด ๆ
หากฉันมีเอาต์พุตที่ยาวมากจากคำสั่ง (บรรทัดเดียว) แต่ฉันรู้ว่าฉันต้องการเพียงแค่ [x] (สมมติว่า 8) ตัวอักษรของเอาต์พุตเป็นวิธีที่ง่ายที่สุดในการรับสิ่งนั้น ไม่มีตัวคั่นใด ๆ
คำตอบ:
วิธีหนึ่งคือการใช้cut
:
command | cut -c1-8
สิ่งนี้จะให้อักขระ 8 ตัวแรกของแต่ละบรรทัดของเอาต์พุต เนื่องจากcut
เป็นส่วนหนึ่งของ POSIX จึงมีแนวโน้มที่จะอยู่ใน Unices ส่วนใหญ่
cut -c
เลือกอักขระ cut -b
หรือhead -c
เลือกไบต์ สิ่งนี้สร้างความแตกต่างในบางภาษา (ในทางปฏิบัติเมื่อใช้ UTF-8)
cut -c-8
จะเลือกจากตัวละคร 1 ถึง 8
cut
เทียบเท่ากับ Windows คืออะไร
command | dd bs=8 count=1 2>/dev/null
ด้วย ไม่ได้บอกว่ามันสั้นกว่าหรือเหนือกว่า ทางเลือกอื่น
cut
, cut -c
ทำงานเหมือนcut -b
(นั่นคือมันไม่ทำงานอย่างถูกต้องสำหรับอักขระหลายไบต์)
นี่คือวิธีอื่น ๆ ในการรับเพียง 8 ตัวอักษรแรก
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
และถ้าคุณทุบตี
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
หรือถ้า sed ของคุณสนับสนุน: command | sed -r 's/(.{8}).*/\1/'
; มิฉะนั้น +1
head -c
นับเป็นไบต์ไม่ใช่ตัวอักษร ในทำนองเดียวกันในการใช้งาน Awk ที่สำคัญมีเพียงGNU awk ที่จัดการอักขระหลายไบต์อย่างถูกต้อง - FreeBSD Awk และ Mawk ไม่
หากคุณมีเชลล์ขั้นสูงเพียงพอ (ตัวอย่างเช่นสิ่งต่อไปนี้จะใช้ได้ใน Bash ไม่แน่ใจว่าจะมีขีดกลาง) คุณสามารถทำได้:
read -n8 -d$'\0' -r <(command)
หลังจากรันตัวละครของคุณจะเป็นตัวแปรในเปลือกread ... <(command)
REPLY
พิมพ์help read
เพื่อเรียนรู้เกี่ยวกับตัวเลือกอื่น ๆ
คำอธิบาย: -n8
อาร์กิวเมนต์ที่read
บอกว่าเราต้องการได้สูงสุด 8 ตัวอักษร -d$'\0'
กล่าวอ่านจนกว่าโมฆะมากกว่าที่จะขึ้นบรรทัดใหม่ วิธีนี้การอ่านจะดำเนินต่อไป 8 อักขระแม้ว่าหนึ่งในอักขระก่อนหน้านี้จะเป็นบรรทัดใหม่ (แต่ไม่ใช่ถ้าเป็นโมฆะ) อีกทางเลือกหนึ่ง-n8 -d$'\0'
คือใช้-N8
ซึ่งจะอ่านได้ถึง 8 ตัวอักษรหรือจนกว่า stdin จะถึง EOF ไม่มีตัวคั่นใดให้เกียรติ ที่น่าจะเหมาะกับความต้องการของคุณดีกว่า แต่ผมไม่ทราบว่าหลายเฉพาะหน้าเปลือกหอยได้อ่านว่าเกียรตินิยม-N
เมื่อเทียบกับการเคารพและ-n
-d
ต่อเนื่องกับคำอธิบาย: -r
บอกว่าไม่สนใจ\
-escapes เพื่อให้ตัวอย่างเช่นที่เราปฏิบัติเป็นสองตัวละครมากกว่าที่จะเป็นหนึ่งเดียว\\
\
ในที่สุดเราก็ทำread ... <(command)
มากกว่าcommand | read ...
เพราะในรูปแบบที่สองการอ่านจะถูกดำเนินการใน subshell ซึ่งออกแล้วทันทีสูญเสียข้อมูลที่คุณเพิ่งอ่าน
ตัวเลือกอื่นคือทำการประมวลผลทั้งหมดของคุณภายใน subshell ตัวอย่างเช่น:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
ตัวอักษรและไม่จำเป็นต้องดำเนินการให้ในเปลือกแล้วเพียงแค่ใช้
read -n <num>
; ข้อแม้เล็ก ๆ : Bash 3.x (ปัจจุบันยังคงอยู่บนระบบปฏิบัติการ) ตีความผิดพลาด<num>
เป็นจำนวนไบต์และทำให้ล้มเหลวด้วยอักขระหลายไบต์; สิ่งนี้ได้รับการแก้ไขใน Bash 4.x
อีกหนึ่งโซลูชั่นซับโดยใช้การขยายพารามิเตอร์
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}
แทนการเข้ารหัสจำนวนเต็มอย่างหนัก
ฉันมีปัญหานี้เมื่อสร้างไฟล์เช็คซัมด้วยตนเองในที่เก็บ Maven แต่น่าเสียดายที่cut -c
พิมพ์ขึ้นบรรทัดใหม่เสมอในตอนท้ายของการส่งออก เพื่อระงับการที่ฉันใช้xxd
:
command | xxd -l$BYTES | xxd -r
มันส่งออก$BYTES
ไบต์ที่แน่นอนเว้นแต่ว่าการcommand
ส่งออกของจะสั้นลงแล้วเอาท์พุทว่า
cut
บรรทัดใหม่ของการต่อท้ายคือการ pip ลงใน:| tr -d '\n'