Nói chung, một công cụ càng chuyên dụng thì càng nhanh. Vì vậy, trong hầu hết các trường hợp, bạn có thể mong đợi cut
và grep
nhanh hơn sed
, và sed
nhanh hơn awk
. Nếu bạn đang kết hợp các đường ống dài hơn của các công cụ đơn giản hơn với một lần gọi một công cụ phức tạp hơn, thì không có quy tắc nào. Điều này chỉ quan trọng với đầu vào lớn (giả sử, hàng triệu dòng); đối với đầu vào ngắn, bạn sẽ không thấy bất kỳ sự khác biệt.
Ưu điểm của các công cụ phức tạp hơn tất nhiên là chúng có thể làm được nhiều thứ hơn.
Lệnh của bạn sử dụng mèo không cần thiết. Thay vào đó, hãy sử dụng chuyển hướng (đặc biệt nếu bạn lo lắng về tốc độ, mặc dù có lẽ bạn không nên lo lắng về tốc độ cho đến khi bạn chạy điểm chuẩn¹).
<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
Các lệnh này gần như tương đương. Sự khác biệt là:
- awk và grep có các cú pháp regrec khác nhau . Awk và
grep -E
có các cú pháp regrec gần như giống hệt nhau (các biểu thức chính quy mở rộng).
cut -d ' '
coi mỗi nhân vật không gian riêng lẻ là một dấu phân cách. Dấu phân cách mặc định của Awk là bất kỳ chuỗi khoảng trắng nào, có thể là nhiều khoảng trắng, một tab, v.v. Bạn không thể sử dụng các chuỗi khoảng trắng tùy ý làm dấu phân cách cut
. Để sử dụng các không gian riêng lẻ làm dấu phân cách trong awk, hãy đặt dấu phân cách trường thành biểu thức chính quy phù hợp với một không gian duy nhất, không phải là biểu thức chính bao gồm một không gian duy nhất (đó là trường hợp đặc biệt có nghĩa là bất kỳ chuỗi khoảng trắng nào, tức là mặc định) : awk -F '[ ]' '/WORD/ {print $2}'
.
¹ Nguyên tắc đầu tiên của Tối ưu hóa chương trình: Đừng làm điều đó. Quy tắc tối ưu hóa chương trình thứ hai (chỉ dành cho chuyên gia!): Đừng làm điều đó. - Michael A. Jackson
echo filename
haycat filename
?