web-dev-qa-db-fra.com

Comment rechercher et couper des chaînes d'un fichier?

J'essaie d'écrire un programme avec des options et des arguments comme celui-ci:

./program.sh -f <filename> -string <string>

Le programme est supposé sortir la ligne de <filename> qui commence par <string> comme ceci:

 grep ^<string> <filename> 

De plus, il est supposé renvoyer des informations associées à la chaîne, telles que name et age dans l'exemple de fichier d'entrée suivant:

string name age sex
Akdk john 22 male
Jrtkfp miah 26 female

Comment puis-je obtenir un comportement comme ça?

2
N. Kouk

Une opération aussi simple que celle-ci peut être réalisée avec un oneliner, vous n'avez pas besoin d'un script complet pour cela. Je choisirais une fonction que vous pouvez insérer dans votre fichier ~/.bash_aliases afin qu’elle soit chargée dans chaque terminal ouvert.

function_name(){ awk /^$2/'{print $1": "$2", "$3}' $1 ;}

Cela vous permet d’appeler function_name <filename> <string> et d’obtenir le résultat suivant:

$ cat test
string name age sex
Akdk john 22 male
Jrtkfp miah 26 female

$ function_name test Akdk
Akdk: john, 22

Comme vous pouvez le constater, vous pouvez atteindre cet objectif sans aucune option. Il est beaucoup plus simple d’utiliser des arguments. Si vous avez en quelque sorte besoin d'options, je recommande ce tutoriel et cet article .

Des explications

  • function_name(){ … ;} - définit la fonction function_name qui fait
  • awk /^$2/'{…}' $1 - dans le fichier indiqué comme premier argument de la fonction ($1), recherchez les lignes commençant par (^) par le second argument ($2) du fonction et faire avec elle
  • awk '{print $1": "$2", "$3}' - affiche la première colonne (séparée par des espaces), puis ":", puis la deuxième colonne, puis "," et ensuite la troisième colonne

NB: E.g. $1 a une signification différente pour bash (ce qui exécute votre terminal) comme pour awk: le premier le développe au premier argument que vous lui avez donné, le second l'interprète comme un raccourci pour le première colonne. C'est pourquoi nous avons besoin de guillemets simples (') autour de la commande awk de print, de cette façon, bash ne développe pas $1 mais le laisse intacte pour awk à analyser.

6
dessert