Eu tenho um arquivo
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)
Agora eu quero extrair apenas os caminhos de arquivo e armazená-lo em outro arquivo. O arquivo de saída é como:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Usando sed ou awk, como posso fazer isso?
Eu tentei, sed -n '/"/,/"/p' myfile
mas não está funcionando.
Respostas:
Você pode canalizar o stderr do seu comando rsync para um script awk:
Ou para um comando de corte como este:
fonte
cut -d\" -f2
"
e"
no stderr.$1
; tudo entre a primeira e a segunda aspas duplas é$2
; e tudo depois da segunda citação dupla está em$3
($4
, ...). O nome do arquivo está (aparentemente) sempre entre as duas primeiras aspas duplas, portanto essa solução deve funcionar (e funcionou quando eu a testei).Usando
sed
:Isso procura: início da linha, uma série de não-aspas, aspas duplas, captura uma série de não-aspas, aspas duplas e qualquer outra coisa na linha e a substitui pelo material capturado.
Teste no RHEL 5 Linux com GNU
sed
, mas apenas usando recursos que funcionariam na versão UNIX ™ da 7ª Ediçãosed
.Aliás, uma maneira um pouco mais simples de fazer isso é com dois comandos substitutos; altere tudo até e incluindo a primeira aspas duplas para uma sequência vazia (que é uma sequência de zero ou mais sem aspas seguidas por aspas duplas); mude tudo depois do que agora é a primeira citação dupla para nada:
Aliás, o comando que você tentou (`sed -n '/" /, / "/ p') imprime de uma linha contendo aspas duplas para a próxima linha que contém aspas duplas, sem editar as linhas. Foi por isso que não pareceu funcionar para você - fez o que você pediu, mas o que você pediu para fazer não foi o que você pretendia pedir.
Em termos de eficiência, é improvável que haja uma diferença mensurável no desempenho. Em termos de facilidade de manutenção, suspeito que este último seja menos exigente para as células cerebrais.
fonte
Se sua versão do
grep
suporta Perl-regexp:Resultados:
Você também pode tornar isso menos rigoroso, para combinar qualquer coisa entre os duplos, se desejar:
fonte
.*
não ganancioso.*?
apenas no caso de haver uma citação dupla extra mais adiante na linha? Ou usar[^"]*
no lugar de.*
?Use o operador >> para salvar qualquer saída em um arquivo.
Gostar
Então, basta alterar isso para o seu cenário específico usando sed, acrescentando
para o comando
fonte
grep -r
faz uma pesquisa recursiva nos diretórios listados nos argumentos (*
). Não está claro qual padrão você tem em mente, mas entenderágrep
toda a linha. O objetivo do exercício é coletar informações de parte de uma linha. Se você estiver usando o GNUgrep
, existem maneiras de fazer isso (-o
); estes não são padrão (exceto na medida em que o GNU define um padrão de fato). Da mesma forma com o uso de expressões regulares do PCRE; essas são outra extensão GNU. Eles são bons se você tiver o GNUgrep
e não planeja trabalhar em plataformas nas quais o GNUgrep
não está disponível por padrão.