Xóa 8 cột đầu tiên khỏi ls Đầu ra với AWK


1

Tôi muốn sử dụng AWK để xóa 8 cột đầu tiên khỏi đầu ra sau:


ls -l

lrwxrwxrwx 1 user user   23 jul 27 00:04 file1.pdf
-rw-rw-r-- 1 user user  107 may  8 13:59 file 2 with spaces.mp3
lrwxrwxrwx 1 user user   11 jul 24 19:43 file3-with-hyphens.txt
lrwxrwxrwx 1 user user   11 jul 24 19:43 and_another_file4_with_underscores.md
-rw-rw-r-- 1 user user  107 may  8 13:59 file 5 with way more spaces than the rest.mp3

và gửi kết quả đến một tệp văn bản. Tôi có thể làm điều đó bằng tay trong vim với khối chọn trực quan, tuy nhiên tôi muốn có một kịch bản để thực hiện tự động.

Nhìn xung quanh tôi đã có thể tìm thấy này trang ở đâu, bằng cách thay đổi các bộ phận liên quan của ví dụ 9 và đường ống đầu ra cho chính nó nhiều lần theo yêu cầu, tôi đã có thể để có được kết quả mong muốn, nhưng tôi cảm thấy rằng phải có một tốt hơn (thanh lịch hơn và / hoặc nhỏ gọn) để làm điều đó nhưng không thể tìm thấy nó hoặc tự mình tìm ra.

Mã cuối cùng của tôi là như sau:

awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 ~/file_folder_content.txt | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 | ... | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 >> ~/file_folder_content.txt

Lưu ý 1: Tôi hy vọng đầu ra thực tế từ lslệnh sẽ lớn hơn nhiều so với điều này.

Lưu ý 2: Tôi đã cố in trường thứ 9, nhưng vì một số tên tệp chứa khoảng trắng, nên điều này chỉ in từ đầu tiên trong tên tệp.


1
Xóa 8 cột đầu tiên? Đầu ra đó chỉ có 8 cột. Bạn đang cố gắng chỉ in tên tập tin? ls -1làm điều đó
confetti

Thử và lỗi để lại cho tôi với lệnh vô lý này: ls -l | tail -n +2 | column -tdN test -o "|" | cut -d "|" -f 9- Nó chỉ in cột thứ 9. Phải có một cách tốt hơn nhưng hey, nó hoạt động, lol.
confetti

Câu trả lời:


1

Điều này sẽ làm những gì bạn muốn trong awk:

ls -l | awk '$9~/./{for (i=1;i<9;i++){$i=""}; gsub(/^ +/,""); print}'

Đây là một cách tiếp cận hơi khác trong perl:

ls -l | perl -lane 'if ($F[7]=~/./) {s/.*$F[7]//; print}'

Lưu ý: Tôi không thể nhưng khuyên bạn nên suy nghĩ thấu đáo về những gì bạn thực sự muốn đạt được, vì có thể có những cách tốt hơn. Như được đề cập bởi @confetti , chỉ cần in tên tệp là hoàn thành rõ ràng hơn ls -1.

Lưu ý: Như đã chỉ ra chính xác trong các ý kiến, giải pháp này không mạnh mẽ. Tôi sẽ thêm rằng không có phân tích cú pháp lscó thể được coi là an toàn và âm thanh.

Học AWK: Vì OP đã giải thích trong các ý kiến ​​rằng câu hỏi này là một phần của một nhiệm vụ rộng lớn hơn để trở nên thành thạo AWK, tôi có một vài đề xuất.


1
Tạo một tệp có nhiều khoảng trắng liên tiếp trong tên của nó và xem lệnh của bạn in ra cho nó.
Kamil Maciorowski

1
(đối với awk) hoặc tệp có tên 0000hoặc -00.00hoặc0e42
dave_thedom_085

@ dave_thndry_085 quan sát đúng đắn! Trường hợp quan trọng này có thể được đưa vào tài khoản thay thế $9bằng $9~/./$F[7]bằng $F[7]=~/./, nhưng toàn bộ ý tưởng phân tích cú pháp lsđầu ra nên được xem xét lại.
simlev

@simlev Vấn đề rộng lớn hơn mà tôi đang cố gắng giải quyết là trở nên thành thạo với AWK, vì vậy đây chỉ là vấn đề mà tôi nghĩ ra để thực hành, nhưng không thể tìm ra cách giải quyết (ngoại trừ mã mà tôi cung cấp ). Tôi đã mong đợi đây là một cách làm việc không hiệu quả, nhưng cũng hy vọng sẽ học được một cách tốt hơn để làm điều đó trong quá trình này.
Chúa Giêsu DA

@simlev Tôi diffchỉnh sửa đầu ra từ câu trả lời của bạn với tệp được chỉnh sửa thủ công của chúng và chúng bằng nhau, vì vậy đây là câu trả lời tôi đang tìm kiếm. Thêm vào đó, nó cung cấp một cách tốt hơn để làm điều đó và đề cập đến những thiếu sót của việc phân tích kết quả từ đó ls.
Chúa Giêsu DA

0

Điều này trông giống như một vấn đề XY . ls -1nên in những gì bạn muốn Tùy chọn này được POSIX yêu cầu nên không chắc bạn lskhông hỗ trợ.

Tuy nhiên, nếu bạn sắp phân tích kết quả, bạn hoàn toàn không nên sử dụngls . Sử dụng find, tốt nhất là với -print0hành động.

Vì vậy, lskhông phải là công cụ phù hợp. Nếu bạn cứ khăng khăng phân tích cú pháp lsđầu ra, thì đó awkcũng không phải là công cụ phù hợp. Lý do:

  • Các cột của bạn được phân cách bằng dấu cách; đôi khi có hai hoặc ba không gian liên tiếp, điều này khác nhau từ dòng này sang dòng khác. Vì vậy, với dấu phân cách ngây thơ này, một tên tệp trong một dòng có thể bắt đầu ở cột thứ N, trong khi ở dòng khác, nó ở cột (N + 1).
  • Bạn có thể yêu awkcầu coi nhiều khoảng trắng là một dấu phân cách ( awk -F ' +') nhưng điều này sẽ xáo trộn tên tệp với nhiều khoảng trắng liên tiếp.
  • Vì vậy, bạn cần một số logic để xác định nơi một tên tệp bắt đầu trong mỗi dòng. Điều này có thể được thực hiện (tôi tin awklà Turing đã hoàn thành), tôi không thể cung cấp cho bạn bất kỳ giải pháp làm việc nào.

Ngay cả đầu ra của ls -1không nên được phân tích cú pháp, ls -llà tồi tệ hơn.


Khi bạn chỉ ra lslà không mạnh mẽ, sẽ không còn hữu ích để suy đoán về cách nó có thể được phân tích cú pháp bằng bất kỳ công cụ cụ thể nào. Để chứng minh thêm rằng nó hoàn toàn vô dụng như thế nào, tôi cho một người có tên nhóm có chứa khoảng trắng.
simlev
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.