it-swarm-vi.com

Lấy các ký tự [x] đầu tiên cho một chuỗi từ một đường ống

Nếu tôi có đầu ra thực sự dài từ một lệnh (một dòng) nhưng tôi biết tôi chỉ muốn các ký tự [x] (giả sử 8) đầu tiên của đầu ra, cách dễ nhất để có được điều đó là gì? Không có bất kỳ dấu phân cách nào.

67
xenoterracide

Một cách là sử dụng cut:

 command | cut -c1-8

Điều này sẽ cung cấp cho bạn 8 ký tự đầu tiên của mỗi dòng đầu ra. Vì cut là một phần của POSIX, nên có khả năng nó có trên hầu hết các Thông báo.

95
Steven D

Đây là một số cách khác để chỉ nhận 8 ký tự đầu tiên.

command | head -c8

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

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

Và nếu bạn có bash

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

Một giải pháp lót khác bằng cách sử dụng mở rộng tham số

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
Prabhat Kumar Singh

Nếu bạn có Shell đủ nâng cao (ví dụ: phần sau sẽ hoạt động ở Bash, không chắc chắn về dấu gạch ngang), bạn có thể làm:

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

Sau khi thực hiện read ... <(command), các ký tự của bạn sẽ ở trong biến Shell REPLY. Nhập help read Để tìm hiểu về các tùy chọn khác.

Giải thích: đối số -n8 Cho read nói rằng chúng tôi muốn tối đa 8 ký tự. -d$'\0' Cho biết đọc cho đến khi null, thay vì dòng mới. Bằng cách này, việc đọc sẽ tiếp tục cho 8 ký tự ngay cả khi một trong các ký tự trước đó là một dòng mới (nhưng không phải là một ký tự không). Một cách khác để -n8 -d$'\0' Là sử dụng -N8, Đọc chính xác 8 ký tự hoặc cho đến khi stdin đạt EOF. Không có dấu phân cách được vinh danh. Điều đó có thể phù hợp với nhu cầu của bạn hơn, nhưng tôi không biết có bao nhiêu vỏ có một lần đọc tôn vinh -N Trái ngược với việc tôn vinh -n-d. Tiếp tục với lời giải thích: -r Nói bỏ qua \ - thoát, do đó, ví dụ, chúng tôi coi \\ Là hai ký tự, thay vì một \.

Cuối cùng, chúng tôi thực hiện read ... <(command) chứ không phải command | read ... Bởi vì ở dạng thứ hai, việc đọc được thực thi trong một lớp con sau đó thoát ra ngay lập tức, làm mất thông tin bạn vừa đọc.

Một tùy chọn khác là thực hiện tất cả quá trình xử lý của bạn bên trong lớp con. Ví dụ:

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

Đây là di động:

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

Để xây dựng một chuỗi các ký tự có độ dài thay đổi có câu hỏi riêng của nó ở đây .

1
user79743

Tôi gặp vấn đề này khi tự tạo các tệp tổng kiểm tra trong kho lưu trữ maven. Không may cut -c luôn in ra một dòng mới ở cuối đầu ra. Để ngăn chặn việc tôi sử dụng xxd:

command | xxd -l$BYTES | xxd -r

Nó xuất ra chính xác $BYTES byte, trừ khi đầu ra của command ngắn hơn, thì chính xác là đầu ra đó.

0