web-dev-qa-db-fra.com

Imprimer des mots / nombres spécifiques via des commandes grep / cut

J'ai un fichier test.txt, qui contient le résultat suivant:

service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

et ainsi de suite jusqu'à service_name1500

Je veux une sortie comme:

Egg 12.34.56
joker 23.45.67

et ainsi de suite: le numéro de version avec le mot précédent.

7
Donald

Cela devrait être un simple travail cut:

cut -d/ -f5,6 --output-delimiter=" "
  • -d/ définit le délimiteur d'entrée sur /
  • -f5,6 renvoie uniquement les 5ème et 6ème champs
  • --output-delimiter=" " définit le délimiteur de sortie comme un espace

La même chose avec awk, awk définit par défaut le séparateur de champ en sortie comme espace:

awk -F/ '{print $5,$6}'

Exemple:

% cat file.txt
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

% cut -d/ -f5,6 --output-delimiter=" " file.txt
Egg 12.34.56
joker 23.45.67

% awk -F/ '{print $5,$6}' file.txt
Egg 12.34.56 
joker 23.45.67
10
heemayl

une solution sed(fonctionne si la position de champ de la chaîne de version est cohérente ou non, mais la forme de la chaîne de version doit être cohérente)

$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
Egg 12.34.56

joker 23.45.67

Explication

  • -r utilise ERE pour ne pas avoir à échapper des métacaractères ()
  • s#old#new# trouver le modèle oldet remplacer par newname__
  • .* correspond à aucun caractère ou aucun dans cette position
  • (stuff) mémoriser stuffpour plus tard
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2} motif de [2 chiffres]. [2 chiffres]. [2 chiffres]
  • \1 \2 les deux modèles mémorisés avec un espace entre eux
8
Zanna

Cela va le faire:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
5
Soren A

Si vous travaillez avec des postes Word fixes, cela fonctionnera:

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
3
0x0C4
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt

Explication:

  • .* au début et à la fin coupe tous les caractères qui ne correspondent pas aux suivants
  • ([[:alpha:]]+) le premier sous-groupe entre parenthèses ne correspond qu'à des caractères alphabétiques
  • \/ correspond à une barre oblique qui sera découpée
  • le prochain sous-groupe ([\.0-9]*) fait correspondre les nombres et les points et les stocke dans le deuxième registre
  • après la barre oblique unique / vient la substitution avec \1 \2 insère les premier et deuxième registres des sous-groupes correspondants
2
SeDav

Longue mais fonctionnelle python one-liner:

$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt          
Egg 12.34.56
joker 23.45.67

Comment ça marche:

  • redirige le fichier d'entrée avec < dans le flux stdin de python
  • utilisez la compréhension de la liste [item for item in sequence] pour lire ligne par ligne stdin
  • .split() nous permet de décomposer les lignes en une liste de mots en utilisant / comme séparateur
  • extraire les mots 4 et 5 (le [4: 6] implique que le dernier chiffre n’est pas inclusif) et en faire une chaîne en utilisant ' '.join()
  • après avoir créé la liste des chaînes souhaitées, transformez-les en lignes à l'aide de '\n'.join() et imprimez le tout
1
Sergiy Kolodyazhnyy