7
votes

Comment stocker la valeur de la commande CAT dans la variable var?

J'essaie de trouver le nombre de fois qu'une chaîne est répétée dans un fichier, dans le même temps, je dois la stocker dans une variable.

Quand j'utilise la commande ( nom de fichier de chat | grep -c '123456789' code>), il affiche le nombre correctement, mais lorsque j'utilise la commande ci-dessous, il affiche la commande non trouvée. p>

var =$(cat filename | grep -c '123456789')
echo $var


2 commentaires

Avez-vous besoin des citations simples autour de votre chaîne de recherche pour Grep?


@Levon, citations simples autour de la regex for Grep ne serait requise que si la regex contient des caractères qui seraient interprétés par la coquille, comme $ ou [ ou ou ou ou ou ou ou ou . Comme une très simple regex ne contenant aucun caractère spécial, 123456789 n'a pas besoin d'être cité.


3 Réponses :


16
votes

N'utilisez pas d'espaces autour du panneau = : xxx

lu au moins le BASH PROG INTRO HOWTO

Mais vous avez une utilisation inutile de CAT SO CODE simplement xxx


0 commentaires

1
votes

Utiliser les backuotes fonctionnera également:

$ pwd
/home/user99

$ cur_dir=`pwd`
$ echo $cur_dir
/home/user99


7 commentaires

Cela fonctionne parce que vous avez supprimé l'espace avant le = ; Vous auriez pu garder le $ ( ... ) notation (plus lisible et nitable ) au lieu des backquotes


@ Levon: N'est-il pas nécessaire d'utiliser $ symbole dans la commande ci-dessus?


@JackieJames Pas nécessaire, la commande fonctionne comme indiqué, vous pouvez utiliser les backquotes à la place. J'ai utilisé cela à la fois avec Bash et le TCSH. Avez-vous rencontré des problèmes d'essayer cela?


@ Levon: varexe = (nom de fichier de chat | grep -c 123456789 ') `echo $ varx il n'imprime rien.


@Jackiejames pouvez-vous copier directement à partir de ma réponse (j'ai testé ceci, à l'aide d'une chaîne de fichier et de grep différente). Ce que vous venez de poster semble manquer la principale backquote, la citation unique devant le 1234, et il semble que vous ayez une place après le = ... laissez-moi savoir


varexe = (nom de fichier de chat | grep -c 123456789 ') `echo $ varx ./count1.sh: ligne 1: EOF inattendu en recherchant une correspondance`' './count1.sh: Ligne 3: Erreur de syntaxe: fin de fichier inattendu


@JackieJames Désolé, je ne peux pas expliquer pourquoi cela ne fonctionne pas pour vous et que je pense que vos messages sont en train de se mettre en forme avec le formatage de sorte qu'il est difficile pour moi de savoir ce qui est saisi exactement. Je viens de poster un autre exemple (celles-ci sont toutes coupées et pâtes d'une coque UNIX).



6
votes

N'oubliez pas que GREP peut lire le fichier directement. Vous pouvez éviter Utilisation inutile de chat strong>.

Dans l'exemple de votre question, la commande pas trouvée em> stre> erreur est à cause de l'espace avant le signe égal. Essayez cela à la place: p> xxx pré>

ou si vous utilisez bash: p> xxx pré>

ou (pour l'exhaustivité) dans csh / TCSH: P>

setenv var `grep -c '123456789' filename`


2 commentaires

Cela fonctionne bien depuis parce que je saisis directement les données. déclarer -a Arr arr = ($ (awk '/ 123456789 / {impression nr}' Nom de fichier)) echo $ {arr [0]} echo $ {arr []} bt quand je fais comme ci-dessous, ça ne fait pas " t Travaux. Pouvez-vous me faire savoir comment le paramètre 'NAME' peut être utilisé INT Commande ci-dessous: echo Entrez votre recherche de recherche: Lire le nom Déclarez -Ar arr = ($ (AWK '/ "$ nom" / {imprimé nr}' FileName) echo $ {arr [0]} echo $ {arr []}


Il est difficile de comprendre ce que vous demandez en fonction de ce commentaire, éventuellement dû au désordre effectué par le formatage de SO. Si vous devez ajouter plus de détails à votre question, veuillez cliquer sur le modifier le lien sous la question, apportez vos modifications, et je 'll mettre à jour ma réponse en conséquence.