Có thể sử dụng tùy chọn gawk
của mình -i inplace
và cũng có thể in mọi thứ stdout
không?
Ví dụ: nếu tôi muốn cập nhật một tệp và nếu có bất kỳ thay đổi nào, hãy in tên của tệp và các dòng đã thay đổi để stderr
tôi có thể làm một cái gì đó như
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
nhưng có cách nào để sử dụng stdout
thay thế, hoặc cách sạch hơn để in khối đó sang luồng thay thế?
grep
có thể nhanh hơn bao nhiêu . Bản năng đầu tiên của tôi là tránh phải "xử lý" tệp hai lần, nhưng tôi sẽ không ngạc nhiên nếu nó thực sự nhanh hơn dù sao. Nó chỉ cho thấy lý do tại sao tôi có thể tin vào ruột của mình vào các nhiệm vụ hồ sơ
-print -exec gawk
không được thực hiện nữa) và 2) nó sẽ dừng ở trận đấu thứ nhất vì vậy trừ khi trận đấu thứ nhất diễn ra dòng cuối cùng bạn vẫn không xử lý toàn bộ tệp hai lần (giống như gấp 1 lần). Ngoài ra, nếu gawk -i inplace
hoạt động như sed -i
nó sẽ chỉnh sửa tệp tại chỗ bằng mọi cách - tức là cập nhật dấu thời gian, inode, vv ngay cả khi không có gì để chỉnh sửa ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
đó theo cách đó, bạn sẽ chỉ sử dụng awk để chỉnh sửa các tệp thực sự chứa các dòng khớp với mẫu đó.