Tengo un archivo
xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
Ahora quiero extraer solo las rutas de archivo y almacenarlo en otro archivo. El archivo de salida es como:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Usando sed o awk, ¿cómo puedo hacer esto?
Lo he intentado sed -n '/"/,/"/p' myfile
pero no funciona.
Respuestas:
Puede canalizar stderr de su comando rsync a un script awk:
O para un comando de corte como este:
fuente
cut -d\" -f2
"
y"
en stderr.$1
; todo entre la primera y la segunda comillas dobles es$2
; y todo después de la segunda comilla doble está en$3
($4
, ...). El nombre del archivo está (aparentemente) siempre entre las dos primeras comillas dobles, por lo que esta solución debería funcionar (y lo hice cuando lo probé).Utilizando
sed
:Eso busca: comienzo de línea, una serie de no comillas, una comilla doble, captura una serie de no comillas, una comilla doble y cualquier otra cosa en la línea, y lo reemplaza por el material capturado.
Probar en RHEL 5 Linux con GNU
sed
, pero solo utilizando características que habrían funcionado en la 7ª edición de la versión UNIX ™ desed
.Por cierto, una forma un poco más simple de hacerlo es con dos comandos sustitutos; cambie todo hasta e incluyendo la primera comilla doble a una cadena vacía (es una secuencia de cero o más comillas no seguidas de una comilla doble); cambie todo después de lo que ahora es la primera cita doble a nada:
Por cierto, el comando que intentó ('sed -n' / "/, /" / p ') se imprime desde una línea que contiene una comilla doble a la siguiente línea que contiene una comilla doble, sin editar las líneas en absoluto. Por eso no pareció funcionar para usted: hizo lo que le pidió, pero lo que le pidió que hiciera no era lo que tenía la intención de pedirle.
En cuanto a la eficiencia, es poco probable que haya una diferencia apreciable en el rendimiento. En términos de facilidad de mantenimiento, sospecho que este último es menos exigente para las células cerebrales.
fuente
Si su versión de
grep
admite Perl-regexp:Resultados:
También puede hacer que esto sea menos estricto, para que coincida con cualquier cosa entre los dobles si lo desea:
fuente
.*
no codicioso por.*?
si acaso hay una cita doble adicional más adelante en la línea? O utilizar[^"]*
en lugar de.*
?Use el operador >> para guardar cualquier salida en un archivo.
Me gusta
Así que solo cambie eso para su escenario específico usando sed agregando
a la orden
fuente
grep -r
hace una búsqueda recursiva utilizando otros directorios que aparecen en los argumentos (*
). No está claro qué patrón tienes en mente, perogrep
recogerá toda la línea. El propósito del ejercicio es recopilar información de parte de una línea. Si está utilizando GNUgrep
, hay formas de hacerlo (-o
); estos no son estándar (excepto en la medida en que GNU define un estándar de facto). De manera similar con el uso de expresiones regulares PCRE; esas son otra extensión de GNU. Están bien si tiene GNUgrep
y no planea trabajar en plataformas donde GNUgrep
no está disponible por defecto.