Tôi muốn trích xuất một số dòng với awk
. Có thể thực hiện các nhiệm vụ sau:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
Làm cách nào để hiển thị chi tiết từ số dòng 122 đến 129?
Tôi muốn trích xuất một số dòng với awk
. Có thể thực hiện các nhiệm vụ sau:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
Làm cách nào để hiển thị chi tiết từ số dòng 122 đến 129?
Câu trả lời:
Bạn đã không hiểu làm thế nào awk
hoạt động. "Chương trình" được chỉ định luôn được thực thi một lần cho mỗi dòng (hoặc "bản ghi" theo cách nói awk) của đầu vào, không cần FOR
hoặc có bất kỳ cấu trúc tương tự nào. Chỉ dùng:
phương pháp dài dòng
ls -l | awk 'NR>=122 && NR<=129 { print }'
phương pháp nhỏ gọn hơn
ls -l | awk 'NR==122,NR==129'
Đó là một phạm vi cho NR
, đó là "Bản ghi số", thông thường đây là dòng hiện tại awk
đang xử lý.
awk
mã điển hình cho nhiệm vụ như vậy thường là ls -l | awk 'NR==122,NR==129'
.
Một phương pháp khác sẽ được sử dụng sed
:
ls -l | sed -ne '122,129p'
Nhưng nếu, như câu hỏi của bạn cho thấy, điều quan trọng là sử dụng awk cho việc này, hãy đi với nhận xét của manatwork về câu trả lời của Zrajm. Như tài liệu của awk nêu:
A pattern may consist of two patterns separated by a comma; in this case, the action is performed for all lines from an occurrence of the first pattern though an occurrence of the second.
Vì vậy, nếu bạn muốn, bạn cũng có thể làm cho các điều kiện nâng cao hơn. Ví dụ:
ls -l | awk 'NR==122,/foobar/'
Điều này sẽ bắt đầu đầu ra ở dòng 122 và tiếp tục cho đến khi một dòng chứa từ "foobar".
Nếu bạn cho chúng tôi biết trường hợp sử dụng thực tế , chúng tôi có thể giúp trả lời các câu trả lời cung cấp giải pháp tốt hơn. Tôi lo lắng rằng điều này có vẻ như là một vấn đề XY .
sed
phương pháp,sed
vì nó nhỏ hơn nhiều (và tải nhanh hơn)awk
.