Czy można skorzystać gawkz -i inplaceopcji 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 stdoutzamiast tego sposób użycia lub czystszy sposób wydrukowania tego bloku do alternatywnego strumienia?
grepmoż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 gawknie 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 inplacedziała tak, sed -ito 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.