web-dev-qa-db-fra.com

Comment filtrer les données de txt en utilisant grep ou sed?

J'essaie de récupérer des données sur Twitter. Je suis capable de lire chaque ligne, mais je ne sais pas quelles commandes utiliser pour filtrer les données comme je le veux. Aucune suggestion.

Fichier d'entrée: fichier.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"

Sortie attendue:

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

Code j'ai:

cat file.txt | while read line; 
do

echo "$line"  >> out1.txt

done
2
Kasaram Bala

Pour votre entrée spécifique cela fonctionnera:

grep -Po '\s[a-z1-9-]{2,}(?=\..{2,4})' file.txt
  • -P: nous permet d'utiliser l'avenir.
  • -o: affiche uniquement les matchs.
  • \s: ne cherche que ceux qui commencent par un espace
  • [a-z1-9-]{2,} Suivi de tout caractère alphanumérique ou trait d'union, au moins 2 ou plus.
  • (?=\..{3}): qui se terminera par un point et 2 à 4 caractères (suffixe de domaine) mais ne l'incluez pas.

Voici la sortie:

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

Une meilleure idée (basée sur votre commentaire) est d'utiliser:

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

Voici quelques options.

Approche KISS utilisant deux 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

Plus élégant:

$ Perl -lne 'if (/"Auctions were started for (.*)"/) {print for split(/, | and /, $1)}' file
wantit1.com
wantit2.com
wantit3.com
wantit4.com
sidefun.com
coffeetec.com
lifeout.com
new-fun-boys.com
3
steeldriver

Vous pouvez facilement y parvenir avec une combinaison de grep pour rechercher toutes les lignes dans file.txt contenant le texte "Les enchères ont été commencées pour" et de sed pour extraire uniquement les noms de domaine sans TLD et les imprimer. un par ligne:

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

Voici une ventilation de la commande:

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

Ceci scanne file.txt ligne par ligne et correspond à tout ce qui est (.*) précédé de la chaîne "Auctions were started for et suivi d'un autre ". Nous avons besoin de l'option -P de grep pour activer les expressions régulières PCRE (sinon, nous ne pourrions pas utiliser les recherches (?<=...) et (?=...) regex) et son option -o pour imprimer uniquement la partie correspondante d'une ligne (à l'exclusion des lookarounds) au lieu de la ligne entière.

Dans un deuxième temps, nous dirigeons le résultat de cette première commande vers cette commande sed:

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

Cette ligne sed contient en fait deux commandes, s/and |,|.com//g et y/ /\n/.

Tout d'abord, s/PATTERN/REPLACEMENT/ recherche l'expression régulière (expression rationnelle étendue, en raison de l'option -r). Motif and |,|.com, ce qui signifie and, , ou .com. Ensuite, il remplace cela par rien, ces motifs sont donc réellement supprimés de la ligne d'entrée. Le g à la fin permet la recherche globale et le remplacement au lieu de simplement traiter la première correspondance sur chaque ligne.

Deuxièmement, y/CHARACTERS/REPLACEMENTS/ traduit tous les caractères du premier champ en leurs caractères correspondants dans le deuxième champ. Ici, je l’utilise pour convertir simplement tous les espaces restants en sauts de ligne.

2
Byte Commander