O que faz “grep -v” ^.

1

Eu tenho um script para limpeza de arquivos de dados

O comando:

for i in 'find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-'

Eu tentei executar o comando sem a função grep -v e não vejo nenhuma diferença.

Eu gostaria de saber o que o grep -v "^.$" faz. Eu não criei este script e não consigo encontrar nada online.

    
por Christopher Karsten 26.09.2016 / 12:07

5 respostas

3

grep -v "^.$" imprime todas as linhas da entrada, exceto aquelas que têm apenas um único caractere.

Como é usado em:

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

podemos supor que é para descartar o diretório de trabalho atual ( . ) da saída de find (mostrado quando o caminho relativo . é usado), que pode ser facilmente alcançado pela opção -mindepth 1 , embora aqui seja redundante, pois você está usando o caminho absoluto em find .

Posteriormente, você está pesquisando somente arquivos com data- em seus nomes por grep data- , isso também é redundante. Você pode colocar toda a lógica em uma única invocação find :

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

Largue -print também, é a ação padrão:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

Apenas para observar, se você estiver procurando apenas arquivos, adicione -type f também:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15
    
por 26.09.2016 / 12:15
3

Como outros já disseram, grep -v '^.$' filtra linhas que consistem em exatamente um caractere (linhas que consistem no início da linha ( ^ ) seguidas por um caractere ( . ) seguido pelo final de a linha ( $ ). Outra maneira de escrevê-lo seria grep -vx . , em que -x torna implícita a ^ e $ (a . corresponde à linha inteira).

Na saída de:

find /ddomain/data/shop12/ -mtime +15 -print

Isso faz pouco sentido porque a saída desse comando find normalmente consistirá em linhas como:

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

A única maneira de essa saída conter linhas com um único caractere é se houver um arquivo cujo nome seja algo como foo<newline>X<newline> . Isso é perfeitamente possível, mas eu diria que é improvável que seja a intenção desse comando.

Possivelmente, esse comando foi (incorretamente) adaptado de:

find . -mtime +15 -print | grep -v '^.$' | grep data-

Onde grep foi destinado a filtrar a entrada . (mesmo assim, grep -Fvx . teria sido mais apropriado). No entanto, seria mais sensato escrevê-lo:

find . ! -name . -path '*data-*' -mtime +15

Se você quiser filtrar o diretório de nível superior com find /ddomain/data/shop12/ , faça isso como:

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

Ou se a implementação de find suportar o predicado -mindepth :

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
    
por 26.09.2016 / 12:29
1

Remove o diretório . da lista de find results. É mais fácil explicar por um exemplo:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

Como você pode ver, no primeiro snippet de código, encontramos o resultado . . Então, você passa para as ações tomadas pelo ciclo for .
No segundo snippet, você decide pular o diretório . dos resultados de find , para não enviá-lo para o ciclo for .

    
por 26.09.2016 / 12:17
0

O comando grep -v "^. $" irá "remover" do fluxo o diretório atual e qualquer arquivo / diretório que tenha nome de um símbolo. Por exemplo, vamos executar

ls -a
.  ..  a1 a2 a3

e deixe exec com o grep

ls -a |grep -v "^.$"
..
a1
a2
a3

Como você pode ver o ponto desaparecer

    
por 26.09.2016 / 12:15
0

grep -v '^.$' exclui linhas com apenas um caractere.

Exemplo:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar
    
por 26.09.2016 / 12:15