Como executar grep -v -e 'expr1' e grep -e 'expr2' no mesmo comando?

2

Eu tenho o seguinte comando para extrair uma string que não comece com www. e não contenha / :

grep -v -e '^www\.' -e '/' test2.txt 

Mas eu quero o acima, além de corresponder a somestring.somestring pattern, que pode ser obtido com este comando:

grep -e '^[^\.]*\.[^\.]*$'

Como colocar todas as teses em uma linha?

    
por user9371654 17.08.2018 / 11:52

2 respostas

2

Você não pode combinar correspondências inversas e avançadas em uma invocação grep

Você pode fazer isso com sed :

sed -e '/^www\./d' -e '/\//d' -e '/^[^.]*\.[^.]*$/!d' ./*.txt

Ou awk (que, ao contrário de sed , seria capaz de imprimir o nome do arquivo correspondente como grep ):

awk -F. 'NF == 2 && !/^www\./ && !/\// {print FILENAME": "$0}' ./*.txt

Você pode fazer isso com duas invocações grep, desde que não queira que os nomes dos arquivos sejam impressos:

cat ./*.txt | grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

Aqui, usando cat para alimentar o conteúdo de todos os arquivos em stdin, então o primeiro grep não imprime os nomes dos arquivos. Algumas implementações grep têm grep -h para ignorar a impressão dos nomes dos arquivos, se houver mais de um arquivo. No caso de apenas um nome de arquivo, grep não imprime o nome do arquivo, e você pode alimentá-lo em seu stdin com redirecionamentos:

<onefile.txt grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

Você poderia implementar a negação com os operadores de look-ahead% PC_de% negativos do PCRE se o seu (?!...) for compatível com grep :

grep '^(?!www\.)(?!.*/)[^.]*\.[^.]*$' ./*.txt

Mas aqui, você poderia fazer tudo com -P com:

grep -v -e / -e '^www\.' -e '^[^.]*$' -e '\..*\.'

Isso também exclui linhas que não contenham pontos nem linhas que contenham mais de um ponto.

    
por 17.08.2018 / 12:06
2

Canalize o primeiro resultado de grep para o segundo grep .

    
por 17.08.2018 / 12:01

Tags