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.