Làm thế nào để chạy awk cho một số dòng.?


17

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?


Nếu bạn thực hiện điều này trong một vòng lặp, tôi sẽ đề xuất sedphương pháp, sedvì nó nhỏ hơn nhiều (và tải nhanh hơn) awk.
zrajm

Câu trả lời:


36

Bạn đã không hiểu làm thế nào awkhoạ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 FORhoặ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ý.


6
Trên thực tế, awkmã điển hình cho nhiệm vụ như vậy thường là ls -l | awk 'NR==122,NR==129'.
manatwork

Lệnh lấy 100 dòng cuối cùng từ tệp bằng awk là gì
Shihabudheen KM

8

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 .


2

Một cách khác để làm điều này (mặc dù tôi thích awkphương pháp này) bằng cách sử dụng coreutils:

ls -l | tail -n +122 | head -n 8
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.