Você pode canalizar o stderr do seu comando rsync para um script awk:
awk -F '"' '{print $2}'
Ou para um comando de recorte como este:
cut -d'"' -f2
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 quero extrair somente os caminhos de arquivo e armazená-los 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.
Usando sed
:
sed 's/^[^"]*"\([^"]*\)".*//'
Isso procura: início de linha, uma série de não-cotações, uma aspa dupla, captura uma série de não-cotações, uma aspa dupla e qualquer outra coisa na linha, e substitui pelo material capturado.
$ sed 's/^[^"]*"\([^"]*\)".*//' <<'EOF'
> 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)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
Teste no RHEL 5 Linux com GNU sed
, mas apenas usando recursos que teriam funcionado na versão de sed
do 7th Edition para UNIX ™.
Por acaso, uma maneira um pouco mais simples de fazer isso é com dois comandos substitutos; mudar tudo até e incluindo as primeiras aspas duplas para uma string vazia (que é uma sequência de zero ou mais não-citações seguidas de aspas duplas); mudar tudo depois do que é agora a primeira citação dupla para nada:
sed 's/^[^"]*"//; s/".*//'
Aliás, o comando que você tentou ('sed -n' / "/, /" / p ') imprime de uma linha contendo aspas duplas para a próxima linha contendo aspas duplas, sem editar as linhas. Por isso, parece que não funcionou para você - ele fez o que você pediu, mas o que você pediu para fazer não foi o que você pretendia fazer.
Eficiência-sábia, é improvável que haja uma diferença mensurável no desempenho. Em termos de facilidade de manutenção, suspeito que o último seja menos desgastante para as células cerebrais.
Se a sua versão de grep
for compatível com Perl-regexp:
grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile
Resultados:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Você também pode tornar isso menos estrito, para corresponder a qualquer coisa entre as duplas, se desejar:
grep -oP '(?<=")[^"]*' file >> anotherfile
Use o > > operador para salvar qualquer saída em um arquivo.
Como
grep -r "pattern" * >> file.txt
Então, basta alterar isso para seu cenário específico usando sed acrescentando
>> filename
para o comando
Tags sed