2011-12-18 19 views
5

Tôi đang làm bài tập về nhà. Câu hỏi đặt ra là:Trợ giúp Linux AWK. Có một thời gian AWKful

Viết một kịch bản awk để chọn tất cả các file thông thường (không phải thư mục hoặc liên kết) trong /etc kết thúc với .conf, sắp xếp các kết quả theo quy mô từ nhỏ nhất đến lớn nhất, đếm số lượng các tập tin, và in ra số tệp theo sau là tên tệp và kích thước trong hai cột. Bao gồm hàng tiêu đề cho tên tệp và kích thước. Dán cả tập lệnh của bạn và đầu ra của nó trong vùng trả lời.

Tôi thực sự đang cố gắng để làm việc này thông qua việc sử dụng awk. Đây là những gì tôi nghĩ ra.

ls -lrS /etc/*.conf |wc –l 

sẽ trả lại số 33 đó là số lượng file .conf tập tin trong thư mục.

ls -lrS /etc/*.conf |awk '{print "File_Size"": " $5 " ""File_Name and Size"": " $9}' 

điều này sẽ tạo 2 cột có tên và kích thước của tệp .conf trong thư mục.

Nó hoạt động, nhưng tôi không nghĩ đó là những gì anh ấy đang tìm kiếm. Tôi đang có một thời gian AWKful.

+3

tôi thấy nó khá AWD rằng instrawcter của bạn đang dạy bạn awk tại thời kỳ cuối trong lịch sử Unix Có rất nhiều cách tốt hơn để viết kịch bản có thể đọc được, và nếu instrawcter của bạn khẳng định awn dạy cho bạn phong cách không thể đọc được, thì ít nhất bạn có thể lawrn perl –

+0

bình luận đó !! :) –

Trả lời

4

Hãy xem ở đây ...

chọn tất cả các file thông thường (không phải thư mục hoặc liên kết)

Cho đến nay bạn đã không được giải quyết điều này, nhưng nếu bạn là đường ống trong đầu ra của ls -l..., điều này rất dễ dàng, chọn trên

/^-/ 

vì directo ries bắt đầu với d, liên kết tượng trưng với l v.v. Chỉ các tệp cũ đơn giản mới bắt đầu bằng -. Bây giờ

in ra số lượng file sau

Vâng, đếm trận đấu là đủ dễ dàng ...

BEGIN{count=0} # This is not *necessary*, but I tend to put it in for clarity 
/^-/ {count++;} 

Để có được tên file và kích thước, nhìn vào đầu ra của ls -l và đếm lên cột

BEGIN{count=0} 
/^-/ { 
    count++; 
    SIZE=$5; 
    FNAME=$9; 
} 

Khó khăn lớn ở đây là awk không cung cấp nhiều bằng cách sắp xếp nguyên thủy, vì vậy đó là phần khó khăn. Điều đó có thể bị đánh bại nếu bạn muốn thông minh nhưng nó không phải là đặc biệt hiệu quả (xem điều khủng khiếp tôi đã làm trong a [code-golf] solution). Các dễ (và unixy) điều cần làm là nên phần ống của đầu ra để sort, vì vậy ... chúng tôi thu thập một dòng cho mỗi tập tin vào một chuỗi lớn

BEGIN{count=0} 
/^-/ { 
    count++ 
    SIZE=$5; 
    FNAME=$9; 
    OUTPUT=sprintf("%10d\t%s\n%s",SIZE,FNAME,OUTPUT); 
} 
END{ 
    printf("%d files\n",count); 
    printf(" SIZE \tFILENAME"); # No newline here because OUTPUT has it 
    print OUTPUT|"sort -n --key=1"; 
} 

Cung cấp đầu ra như

11 files 
    SIZE   FILENAME 
     673  makefile 
     2192  houghdata.cc 
     2749  houghdata.hh 
     6236  testhough.cc 
     8751  fasthough.hh 
    11886  fasthough.cc 
    19270  HoughData.png 
    60036  houghdata.o 
    104680  testhough 
    150292  testhough.o 
    168588  fasthough.o 

(BTW - có một thư mục con test đây, và bạn sẽ lưu ý rằng nó không xuất hiện trong kết quả.)

+0

Rất kỹ lưỡng, cảm ơn bạn! Giải thích từng bước là một trợ giúp rất lớn. – user1104868

0

Trước tiên, tôi sẽ tìm các tệp có thứ gì đó như find /etc -type f -name '*.conf'; để bạn có được danh sách các tệp phù hợp. Sau đó, bạn thực hiện ls -l trên chúng (có thể sử dụng xargs). Và sau đó sử dụng awk nên đơn giản.

Nhưng tôi không nghĩ rằng nếu tôi làm nhiều bài tập về nhà hơn sẽ giúp ích cho bạn. Bạn cần phải suy nghĩ một mình và tìm hiểu.

1

Có thể là một cái gì đó như thế này sẽ giúp bạn trên con đường của bạn -

ls -lrS /etc/*.conf | 
awk ' 
BEGIN{print "Size:\tFilename:"} # Prints Headers 
/^-/{print $5"\t"$9} # Prints two desired columns, /^-/ captures only files 
END{print "Total Files = "(NR-1)}' # Uses in-built variable to print count 

Test: Văn bản sau khi # là ý kiến ​​để bạn tham khảo.

[jaypal:~/Temp] ls -lrS /etc/*.conf | 
awk ' 
BEGIN{print "Size:\tFilename:"} 
/^-/{print $5"\t"$9} 
END{print "Total Files = "(NR-1)}' 
Size: Filename: 
0  /etc/kern_loader.conf 
22  /etc/ntp.conf 
54  /etc/ftpd.conf 
105  /etc/launchd.conf 
168  /etc/memberd.conf 
242  /etc/notify.conf 
366  /etc/ntp-restrict.conf 
526  /etc/gdb.conf 
723  /etc/pf.conf 
753  /etc/6to4.conf 
772  /etc/syslog.conf 
983  /etc/rtadvd.conf 
1185 /etc/asl.conf 
1238 /etc/named.conf 
1590 /etc/newsyslog.conf 
1759 /etc/autofs.conf 
2378 /etc/dnsextd.conf 
4589 /etc/man.conf 
Total Files = 18 
0

Disclaimer: tôi không phải là một chuyên gia về vỏ.

nghĩ rằng tôi muốn cung cấp cho này một đi, bị đánh vào tốc độ của bài trả lời mặc dù :-):

clear 

FILE_COUNT=`find /etc/ -name '*.conf' -type f -maxdepth 1 | wc -l` 

echo "Number of files: $FILE_COUNT" 

ls -lrS /etc/[^-]*.conf | awk ' 

BEGIN {print "NAME  |  SIZE"}\ 

{print $9,"  | ",$5}\ 

END {print "- DONE -"}\ 

' 

đầu ra của tôi là :-(xấu xí:

Number of files:  21 
NAME  |  SIZE 
/etc/kern_loader.conf  |  0 
/etc/resolv.conf  |  20 
/etc/AFP.conf  |  24 
/etc/ntp.conf  |  42 
/etc/ftpd.conf  |  54 
/etc/notify.conf  |  132 
/etc/memberd.conf  |  168 
/etc/Symantec.conf  |  246 
/etc/ntp-restrict.conf  |  366 
/etc/gdb.conf  |  526 
/etc/6to4.conf  |  753 
/etc/syslog.conf  |  772 
/etc/asl.conf  |  860 
/etc/liveupdate.conf  |  861 
/etc/rtadvd.conf  |  983 
/etc/named.conf  |  1238 
/etc/newsyslog.conf  |  1590 
/etc/autofs.conf  |  1759 
/etc/dnsextd.conf  |  2378 
/etc/smb.conf  |  2975 
/etc/man.conf  |  4589 
/etc/amavisd.conf  |  31925 
- DONE - 
+0

Đường ống qua 'cột -t' để sửa căn chỉnh:] –

Các vấn đề liên quan