Como filtrar dados do txt usando grep ou sed?

2

Estou tentando obter dados do Twitter, posso ler cada linha, mas não sei quais comandos usar para filtrar dados da maneira que desejo. Alguma sugestão.

Arquivo de entrada: arquivo.txt

id,created_at,text
842433,2017-05-20 14:45:05,goldring.com was just registered https://t.co/xt9345d
336353,2017-05-20 14:45:04,stretch.com was just registered https://t.co/QBEX965hf
84244e,2017-05-20 14:45:03,"Auctions were started for wantit1.com, wantit2.com, wantit3.com and wantit4.com"
842434,2017-05-20 14:45:02,"Auctions were started for sidefun.com, coffeetec.com, lifeout.com and new-fun-boys.com"

Esperando saída:

wantit1
wantit2
wantit3
wantit4
sidefun
coffeetec
lifeout
new-fun-boys

Código que tenho:

cat file.txt | while read line; 
do

echo "$line"  >> out1.txt

done
    
por Kasaram Bala 21.05.2017 / 16:40

3 respostas

2

Para sua entrada específica, isso funcionará:

grep -Po '\s[a-z1-9-]{2,}(?=\..{2,4})' file.txt
  • -P : nos permite olhar para frente.
  • -o : mostra apenas as correspondências.
  • \s : procure apenas os que começam com um espaço
  • [a-z1-9-]{2,} Seguido por qualquer caractere alfanumérico ou hífen, pelo menos 2 ou mais.
  • (?=\..{3}) : que será finalizado por um ponto e 2 a 4 caracteres (sufixo de domínio), mas não o inclui.

Aqui está a saída:

wantit1  
wantit2  
wantit3  
wantit4  
sidefun  
coffeetec  
lifeout  
new-fun-boys  

Uma ideia melhor (com base no seu comentário) é usar:

awk '(/2017-05-20/ && /Auctions were started/)' file.txt | grep -Po '\s[a-z1-9-]{1,}(?=\..{2,4})'
    
por Ravexina 21.05.2017 / 17:38
3

Aqui estão algumas opções.

Abordagem do KISS usando dois greps:

$ grep 'Auctions were started for' file | grep -o '\S*\.com'
wantit1.com
wantit2.com
wantit3.com
wantit4.com
sidefun.com
coffeetec.com
lifeout.com
new-fun-boys.com

Mais elegante:

$ perl -lne 'if (/"Auctions were started for (.*)"/) {print for split(/, | and /, )}' file
wantit1.com
wantit2.com
wantit3.com
wantit4.com
sidefun.com
coffeetec.com
lifeout.com
new-fun-boys.com
    
por steeldriver 21.05.2017 / 17:47
2

Você pode conseguir isso facilmente com uma combinação de grep para encontrar todas as linhas em file.txt contendo o texto "Leilões iniciados para" e sed para extrair apenas os nomes de domínio sem o TLD e imprimir um por linha :

grep -Po '(?<="Auctions were started for ).*(?=")' file.txt | sed -r 's/and |,|.com//g;y/ /\n/'

Aqui está um detalhamento do comando:

grep -Po '(?<="Auctions were started for ).*(?=")' file.txt

Isso verifica file.txt linha por linha e corresponde a qualquer coisa ( .* ) precedida pela string "Auctions were started for e seguida por outra " . Precisamos da opção grep -P para ativar expressões regulares de PCRE (caso contrário, não poderíamos usar as expressões de (?<=...) e (?=...) regex) e sua opção -o para imprimir apenas a parte correspondente de uma linha (excluindo as lookarounds) em vez de toda a linha.

Em uma segunda etapa, canalizamos a saída desse primeiro comando para esse comando sed :

sed -r 's/and |,|.com//g;y/ /\n/'

Esta linha sed contém dois comandos, s/and |,|.com//g e y/ /\n/ .

Primeiro, s/PATTERN/REPLACEMENT/ pesquisa a expressão regular (regex estendido, na verdade, por causa da opção -r ) padrão and |,|.com , o que significa and , , ou .com . Em seguida, substitui isso por nada, então esses padrões são removidos da linha de entrada. O g no final permite a pesquisa e a substituição globais, em vez de apenas processar a primeira correspondência em todas as linhas.

Segundo, y/CHARACTERS/REPLACEMENTS/ traduz todos os caracteres do primeiro campo para os caracteres correspondentes no segundo campo. Aqui estou usando isso para simplesmente converter todos os espaços restantes em quebras de linha.

    
por Byte Commander 21.05.2017 / 17:16