Czy można skorzystać gawk
z -i inplace
opcji i wydrukować coś stdout
?
Na przykład, jeśli chciałbym zaktualizować plik i jeśli są jakieś zmiany, wydrukuj nazwę pliku i zmienione wiersze stderr
, mógłbym zrobić coś takiego
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;}' {} +
ale czy istnieje stdout
zamiast tego sposób użycia lub czystszy sposób wydrukowania tego bloku do alternatywnego strumienia?
grep
może być. Moim pierwszym instynktem jest uniknięcie konieczności dwukrotnego „przetwarzania” pliku, ale nie byłbym wcale zaskoczony, gdyby mimo to był on szybszy. To po prostu pokazuje, dlaczego mogę ufać mojej odwadze w zadaniach profilowania
-print -exec gawk
nie jest już wykonywana) i 2) zatrzyma się przy 1. meczu, więc chyba, że 1. mecz jest w w ostatnim wierszu nadal nie przetwarzasz całego pliku dwa razy (jest to więcej niż 1.X razy). Ponadto, jeśli gawk -i inplace
działa tak, sed -i
to i tak edytuje plik na miejscu - tj. Aktualizuje znaczniki czasu, i-węzeł itp., Nawet jeśli nie było nic do edycji ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
ten sposób, będziesz używał awk tylko do edycji plików, które faktycznie zawierają linie pasujące do tego wzorca.