web-dev-qa-db-fra.com

comment grep pour la ligne avec plusieurs mots clés et le transformer en csv

Avec cette commande:

cmd param | grep 'foo1\|foo5\|foo7'

Je reçois

foo1=bar1
foo5=bar5
foo7=bar7

comment puis-je écrire cette sortie dans un fichier csv?

en fin de compte, je voudrais exécuter la commande dans une boucle avec param change pour chaque boucle (d'où la sortie) afin qu'il soit utile si le fichier devient comme:

cat output.csv
    foo1=bar1, foo5=bar5, foo7=bar7
    foo1=value, foo5=value, foo7=value
2
resultsway

Voici un autre one-liner:

echo $(cmd param | grep 'foo1\|foo5\|foo7') | sed 's/ /, /g' | tee -a output.csv

La commande: echo $(cmd param | grep 'foo1\|foo5\|foo7') imprimera la sortie sous forme linéaire.

Cela met une virgule entre les variables: sed 's/ /, /g'

Ceci ajoute la sortie à une nouvelle ligne à la fin du fichier: tee -a output.csv

2
mchid

Cela fonctionnerait-il pour vous?

cmd param | grep 'foo1\|foo5\|foo7' | tr '\n' ',' | sed 's/,$//'
  • tr '\n' ',' remplace chaque retour de ligne par un ','
  • sed 's/,$//' supprime le dernier caractère s'il s'agit d'un ','

Et si vous voulez le mettre dans un fichier csv, vous pouvez ajouter un '\ n' à la fin de la ligne, puis le rediriger vers un fichier csv:

cmd param | grep 'foo1\|foo5\|foo7' | tr '\n' ',' | sed 's/,\?$/\n/' >> file.csv
  • sed 's/,\?$/\n/' Supprime le dernier caractère s'il s'agit d'un ',' et ajoute un '\ n'
  • >> est utilisé pour ajouter à la fin de votre fichier csv sans enlever ce qui est déjà à l'intérieur
2
Paul

Avec Perl, vous pouvez obtenir le motif, le joindre et l’imprimer pour tous les fichiers souhaités:

Perl -0nE 'say join(",",/(foo\d+=\w+)/g)' ex* > out

Cela évitera votre boucle externe

0
user216043