Lấy một số nội dung nhất định của một tập tin


9

Vì vậy, tôi biết các công cụ tồn tại cho vấn đề này vì tôi đã nghe về chúng, nhưng tôi không biết chúng là gì.

Tôi muốn làm một cái gì đó như lọc ra tất cả dữ liệu trừ tên người dùng trong / etc / passwd.

Ví dụ: tôi muốn lấy user1, user2 và user3 từ tệp sau. Trong trường hợp này, logic có thể là "Lấy văn bản lên đến ':' đầu tiên trên mỗi dòng của tệp".

user1:x:1:4
user2:x:2:5
user3:x:3:6

Đầu ra sẽ là:

user1
user2
user3

Câu trả lời:


19

cuttồn tại cho chính xác mục đích này. Các -dcờ xác định dấu phân cách, và -fquy định cụ thể các trường nào được đầu ra:

cut -d: -f1 /etc/passwd

Đối số -fcó thể là một cái gì đó giống như 1,3hiển thị các trường đầu tiên và thứ ba, hoặc 1-3hiển thị ba trường đầu tiên; cũng có -b-ccờ để đọc byte và ký tự thay vì các trường. Nếu bạn cần một cái gì đó linh hoạt hơn, thường awksẽ thực hiện thủ thuật (xem câu trả lời của Matthew )


13

Mỗi khi bạn muốn trích xuất dữ liệu từ đầu vào dạng bảng, bạn nên xem xét awk . Nó có sẵn trên hầu hết mọi hệ thống Unix, vì vậy đây là một thói quen tốt:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': định nghĩa ":" là dấu phân cách cột.
  • '{}': thực hiện hướng dẫn này cho mỗi dòng.
  • print $1: in cột đầu tiên ra màn hình.

3
Ghi chú ngẫu nhiên: awklấy tên tệp, vì vậy bạn có thể bỏ qua đường ống và chỉ cần làmawk -F: '{print $1}' /etc/passwd
Michael Mrozek

Tôi dường như luôn quên rằng awk lấy một tên tệp, tôi dường như luôn sử dụng nó trong một đường ống ... một cái gì đó như sed | ồ, v.v ...
Matthew Brannigan

hầu hết mọi thứ hoạt động với tệp đều có tên tệp ( tratlà một vài ví dụ về một vài thứ không có).
Tạm dừng cho đến khi có thông báo mới.


1

Bên dưới perl và awk, có một công cụ thứ ba cho những công việc như vậy, đó là sed:

sed 's/:.*//' FILE 

Đây là lệnh thay thế: thay thế từ dấu hai chấm :, theo sau là dấu chấm, là một trò đùa cho các nhân vật thuộc bất kỳ loại nào, thuộc bất kỳ số lượng nào (*), không có gì.

Đó là (ubstolarship) / TỪ / TO / 'với TO trống, có nghĩa là' xóa mọi thứ từ dấu hai chấm đầu tiên (vì sed là mặc định tham lam) (cho đến cuối dòng, vì sed hoạt động tốt với toàn bộ dòng).

Tất nhiên cutlà một mệnh lệnh tốt, nhưng tôi sẽ nói từ một gia đình khác.


1

Trong ví dụ của bạn, cả 3 tên có cùng độ dài. Trong những trường hợp như vậy - điều có thể xảy ra, nhưng không có khả năng xảy ra với / etc / passwd - bạn cũng có thể sử dụng colrm:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

hoặc, tất nhiên

cat FILE | colrm 6 

(một trường hợp hiếm hoi useless use of catkhông áp dụng, vì bạn không thể sử dụng TẬP TIN để hoạt động như một tham số.)


catvẫn còn vô dụng ở đó : colrm 6 < FILE.
manatwork

Vâng, có, nhưng không phải là vô dụng, như trong cách gọi cat foo | grep bar.
người dùng không xác định

1

Chỉ cần hoàn thiện, không cần các lệnh bên ngoài, shell (shell Bourne hoặc tương thích) có thể xử lý nó một mình:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Tất nhiên, đây có lẽ là giải pháp chậm nhất trong tất cả các giải pháp có thể, vì vậy đối với các tệp lớn, hãy chọn một giải pháp khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.