2008-10-20 19 views
5

Có cách nào để làm cho awk (gawk) bỏ qua hoặc bỏ qua các tệp bị thiếu không? Tức là, các tệp được truyền trên dòng lệnh không còn tồn tại trong hệ thống tệp (ví dụ: xuất hiện/biến mất nhanh các tệp trong/proc/[1-9] *).Có thể bỏ qua các tập tin không tồn tại, không có chủng tộc?

Theo mặc định, tệp bị thiếu là một lỗi nghiêm trọng :-(

Tôi muốn để có thể làm tương đương với một cái gì đó như thế này:

BEGIN { MISSING_FILES_ARE_FATAL = 0 } # <- Wishful thinking! 
     { count++ } 
END { print count } 

Một kịch bản wrapper không thể kiểm tra xem file tồn tại befor awk được chạy khi chúng có thể biến mất giữa thời gian chúng được kiểm tra và awk sau đó cố gắng để mở chúng, tức là, nó là một điều kiện chủng tộc. (Nó cũng là một điều kiện chủng tộc để kiểm tra và sau đó mở trong awk, mặc dù thời gian là chặt chẽ hơn)

Trả lời

0

Trong tốt nhất của traditi Tôi sẽ trả lời câu hỏi của bạn với một chương trình Perl.

#!/usr/bin/perl -w 

for my $file (@ARGV) { 
    open my $fh, $file or next; 
    while(<$fh>) { 
     ...do your thing here... 
    } 
} 

(Nó không phải awk, nhưng nó là giải pháp duy nhất mà không có một điều kiện chủng tộc.)

1

Thậm chí gắn bó một perl hoặc vỏ bao bọc xung quanh kịch bản awk của bạn, tôi nghĩ rằng có vẫn sẽ là một điều kiện chủng tộc . Ví dụ, sử dụng đoạn mã shell khác tốt Adept của:

[ -r "$filename" ] && awk -f ... $filename 

không có gì ngăn chặn quá trình này từ đi xa giữa -r và awk thời gian là được xung quanh để cố gắng mở tập tin ...

duy nhất câu trả lời tôi có thể nghĩ là sử dụng LD_PRELOAD để thay thế cuộc gọi mở của hệ thống cho awk, do đó nếu tập tin bị thiếu, một mô tả tập tin đọc trên/dev/null được mở ra để thay thế.

Điều đó có thể làm việc ...

1

Vâng, bạn có thể kiểm tra với cuộc gọi hệ thống về nội dung ARGV, sau đó xử lý chúng qua getline.

if (system("test -r " ARGV[1]) == 0) 
    while ((getline aline < ARGV[1]) >0) 
    # process ARGV[1] via `aline` instead of $0 

...

Sau đó xử lý argv [2], vv HTH

0

Oh, xin lỗi. Bỏ qua câu trả lời trước của tôi. Dưới đây là một gợi ý:

cat /proc/[1-9]* 2>/dev/null | awk .... 

Cát sẽ nuốt chửng tất cả các file, mất tích và hiện như nhau, lỗi mèo sẽ được đổ vào lãng quên (tập tin còn thiếu là lỗi không gây tử vong cho mèo), và awk wil thể để xử lý kết quả.

1

Dường như với tôi rằng tính năng "MISSING_FILES_ARE_FATAL = 0" sẽ là một phần của bản phát hành gawk tiếp theo. Hãy xem tập tin ChangeLog của mã nguồn gawk ổn định hiện tại:

--- snip ---

Fri 22 tháng 8 14:43:49 2008 Arnold D.Robbins

* io.c (nextfile): Users Strong In The Ways Of The Source can use 
non-existant files on the command line without it being a fatal error. 

--- snip ---

http://cvs.savannah.gnu.org/viewvc/gawk-stable/ChangeLog?revision=1.87&root=gawk&view=markup

Hermann

2

gawk 4 có BEGINFILE trong đó bạn có thể kiểm tra cho ERRNO và làm một nextfile nếu ERRNO là không rỗng (chỉ ra rằng tập tin không thể mở được).