J'ai un dossier
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)
Maintenant, je veux extraire les chemins de fichiers uniquement et les stocker dans un autre fichier. Le fichier de sortie est comme:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
En utilisant sed ou awk, comment faire?
J'ai essayé sed -n '/"/,/"/p' myfile
mais ça ne marche pas.
Réponses:
Vous pouvez diriger stderr de votre commande rsync vers un script awk:
Ou à une commande de coupe comme celle-ci:
la source
cut -d\" -f2
"
et"
sur stderr.$1
; tout entre les premier et deuxième guillemets doubles est$2
; et tout après la deuxième citation double est en$3
($4
, ...). Le nom du fichier est (apparemment) toujours entre les deux premiers guillemets doubles, donc cette solution devrait fonctionner (et l'a fait quand je l'ai testée).En utilisant
sed
:Cela recherche: début de ligne, une série de non-guillemets, un guillemet double, capture une série de non-guillemets, un guillemet double et tout autre élément sur la ligne, et le remplace par le matériau capturé.
Testez sur RHEL 5 Linux avec GNU
sed
, mais uniquement en utilisant des fonctionnalités qui auraient fonctionné dans la version UNIX ™ de la 7e éditionsed
.Soit dit en passant, une façon légèrement plus simple de le faire est d'utiliser deux commandes de substitution; changer tout jusqu'à et y compris le premier guillemet double en une chaîne vide (c'est une séquence de zéro ou plusieurs non guillemets suivie d'un guillemet double); changer tout après ce qui est maintenant la première citation double à rien:
Par ailleurs, la commande que vous avez essayée (`sed -n '/" /, / "/ p') imprime d'une ligne contenant un guillemet double à la ligne suivante contenant un guillemet double, sans modifier les lignes du tout. C'est pourquoi cela n'a pas semblé fonctionner pour vous - il a fait ce que vous avez demandé, mais ce que vous lui avez demandé de faire n'était pas ce que vous aviez l'intention de lui demander de faire.
En termes d'efficacité, il est peu probable qu'il y ait une différence mesurable dans les performances. En termes de facilité d'entretien, je soupçonne que ce dernier est moins pénalisant pour les cellules cérébrales.
la source
Si votre version de
grep
prend en charge Perl-regexp:Résultats:
Vous pouvez également rendre cela moins strict, pour faire correspondre n'importe quoi entre les doubles si vous le souhaitez:
la source
.*
non-gourmand.*?
au cas où il y aurait un double guillemet supplémentaire plus tard dans la ligne? Ou utiliser[^"]*
à la place de.*
?Utilisez l'opérateur >> pour enregistrer toute sortie dans un fichier.
Comme
Il suffit donc de changer cela pour votre scénario spécifique en utilisant sed en ajoutant
à la commande
la source
grep -r
effectue une recherche récursive dans tous les répertoires répertoriés dans les arguments (*
). Le modèle que vous avez en tête n'est pas clair, maisgrep
il reprendra toute la ligne. Le but de l'exercice est de collecter des informations à partir d'une partie d'une ligne. Si vous utilisez GNUgrep
, il existe des moyens de le faire (-o
); elles ne sont pas standard (sauf dans la mesure où GNU définit une norme de facto). De même avec l'utilisation d'expressions régulières PCRE; ce sont une autre extension GNU. Ils sont parfaits si vous avez GNUgrep
et n'avez pas l'intention de travailler sur des plates-formes où GNUgrep
n'est pas disponible par défaut.