unix - running - ssh find process name
Procesamiento in situ con grep (8)
Tengo un script que llama a grep para procesar un archivo de texto. Actualmente estoy haciendo algo como esto.
$ grep ''SomeRegEx'' myfile.txt > myfile.txt.temp
$ mv myfile.txt.temp myfile.txt
Me pregunto si hay alguna forma de realizar un procesamiento en el lugar, ya que al almacenar los resultados en el mismo archivo original sin tener que crear un archivo temporal y luego reemplazar el original con el archivo temporal cuando se realiza el procesamiento.
Por supuesto, doy la bienvenida a los comentarios sobre por qué se debe o no hacer esto, pero me interesa sobre todo si se puede hacer. En este ejemplo, estoy usando grep
, pero estoy interesado en las herramientas Unix en general. ¡Gracias!
Almacenar en una variable y luego asignarlo al archivo original:
A=$(cat aux.log | grep ''Something'') && echo "${A}" > aux.log
En general, esto no se puede hacer. Pero Perl tiene el interruptor -i
:
perl -i -ne ''print if /SomeRegEx/'' myfile.txt
Escribir -i.bak
hará que el original se guarde en myfile.txt.bak
.
(Por supuesto, internamente, Perl simplemente hace lo que ya estás haciendo, no implica ninguna magia especial).
La mayoría de las instalaciones de sed
pueden hacer ediciones en el lugar, verifique la página del manual, es probable que desee la -i
.
No, en general no se puede hacer en Unix así. Solo puede crear / truncar (con>) o adjuntar a un archivo (con >>). Una vez truncados, los contenidos antiguos se perderían.
Para editar un archivo in situ usando vim-way, intente:
$ ex -s +''%!grep foo'' -cxa myfile.txt
Alternativamente, utilice sed
o gawk
.
Perl tiene el interruptor -i
, así como sed
y Ruby
sed -i.bak -n ''/SomeRegex/p'' file
ruby -i.bak -ne ''print if /SomeRegex/'' file
Pero tenga en cuenta que todo lo que hace es crear archivos "temporales" en el extremo posterior que cree que no ve, eso es todo.
Otras formas, además de grep
awk
awk ''/someRegex/'' file > t && mv t file
golpetazo
while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file
Vea mis diapositivas "Guía de campo para las opciones de línea de comandos de Perl" en http://petdance.com/perl/command-line-options.pdf para obtener más ideas sobre lo que puede hacer con Perl.
sponge
(en el paquete moreutils
en Debian / Ubuntu) lee la entrada hasta EOF y la escribe en el archivo, por lo que puede grep y volver a escribirlo en sí mismo.
Me gusta esto:
grep ''pattern'' file | sponge file