Cat, Grep, Redirigir salida ... ¿Archivo en blanco?

8

Acabo de correr

cat /opt/webapplications/Word/readme.log | grep -v 'Apple'

y obtuve el resultado en el cli que esperaba, que era todas las líneas readme.logque no contenían ' Apple' ...

Luego corrí ...

cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log

Sin embargo, /opt/webapplications/Word/readme.logestá en blanco.

¿Alguien puede explicarme por qué sucedió esto, o la forma correcta en que debería haberlo hecho?

Jeffrey L. Roberts
fuente
stackoverflow.com/questions/6696842/…
aaaaa dice que reinstalar a Monica el
1
está intentando leer y escribir el mismo archivo y la redirección de los procesos bash primero (de derecha a izquierda)
dice aaaaa reinstalar Monica el

Respuestas:

14

Esto sucedió porque lo primero que >hace es crear el archivo en el que desea escribir, y si el archivo ya existe, su contenido se eliminará. (Además, no es necesario utilizarlo caten su estado de cuenta ya que grepfunciona en archivos, no solo en STDIN).

La forma correcta de hacerlo es utilizar un archivo temporal para leer o escribir. Entonces tampoco

cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log

o

grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log

trabajaría.

Jenny D
fuente
1

Al realizar la redirección al mismo archivo ( >), el shell puede crear / truncar el archivo antes de que catse invoque el comando y se lea la entrada (consulte: ¿Por qué no funciona "ordenar archivo1> archivo1"? ). Si desea filtrar el archivo, es mejor redirigir la salida a un archivo diferente, o evitar la redirección, por ejemplo:

grep -v 'Apple' readme.log | tee readme.log

La forma mejor y más segura es utilizar editores in situ diseñados para ese tipo de operaciones, p. Ej.

sed -i '.bak' '/Apple/d' readme.log

o usar ex(parte de Vim):

ex +g/Apple/d -cwq readme.log

Relacionado:

kenorb
fuente