0
votes

Comment extraire les codes à l'aide de la commande Grep?

J'ai un fichier avec des lignes d'entrée ci-dessous.

John | 1 | R | La catégorie n'est pas trouvée pour la configuration / code / 123.nnn et le client 113
Tom | 2 | R | La catégorie n'est pas trouvée pour la configuration / code local / 123.nnn et le client 114
Peter | 3 | R | La catégorie n'est pas trouvée pour la configuration / code / 456.1 et le client 115

J'ai besoin d'extraire uniquement le texte en surbrillance ci-dessus à l'aide du grep < / code> commande.

J'ai essayé la commande ci-dessous et n'a pas reçu le résultat approprié. Obtenir les 2 caractères non désirés supplémentaires dans la sortie. Veuillez suggérer s'il y a une autre façon d'y parvenir via la commande Grep. xxx

sortie en cours: xxx

Sortie attendue : xxx


0 commentaires

8 Réponses :


0
votes

Ce n'est pas possible d'utiliser Grep. Vous devez utiliser AWK à la place:

â–¶ awk '{split($7, ar, "/"); print ar[3]}' FILE 
123.NNN
123.NNN
456.1
  • the Split Fonction Septe sur une chaîne , ici 7 $ code>, le 7ème champ, placant le résultat dans un tableau AR code>, et à l'aide de la chaîne / code> comme délimiteur. LI>
  • imprime ensuite le 3ème champ de la matrice. LI> ul>

    Remarque: p>

    • Je suppose que tous em> de votre contribution ressemble aux échantillons que vous avez donnés, c'est-à-dire: li> ul> xxx pré>

      aaa code> et ddd code> ne contiendra pas de blancheur. p>

      • Je suppose également que vous avez vraiment un fichier fichier code> contenant ces lignes. C'est un peu flou. Li> ul>

        entrée: p> xxx pré>

        sortie: p> xxx pré> p>


1 commentaires

Cela suppose qu'il n'y a jamais de blancheur dans aucun des champs avant le match. Qui pourrait bien être une hypothèse valable; mais devrait probablement être épelé.



1
votes

Votre regex spécifie une largeur de caractère fixe pour les chaînes de largeur variable. Basé sur vos exemples, quelque chose comme xxx

semble être une meilleure regex. Cependant, nous pourrions probablement aussi simplifier cela en fusionnant les commandes Cut et multiple grep dans un seul script awk. xxx

Les deux Split Les opérations sont juste un moyen peu coûteux de choisir le texte entre / code / et le prochain caractère de blanchiment; Nous avons déjà mis en place à titre de guidage de la chaîne après / code / correspond au motif que nous suivons.

AVIS également comment Trier a une option -u qui vous permet de remplacer (cas triviaux de) UNIQ .

La variante de regex supportée par AWK est légèrement différente de celle prise en charge. par POSIX GREP ; Donc, le backslashed \ + dans grep s BRE BREAL est la simple + dans la dialecte appelée ere qui est [plus ou moins] prise en charge par awk - et grep -e . Si vous avez grep -p , vous pouvez utiliser une troisième variante qui a une fonctionnalité pratique; xxx

\ k Dit "Match jusqu'à présent, mais tout oublie tout avant" et imprime donc la partie après ce jeton.


1 commentaires

Ceci est plus clair pour moi awk -f '|' La catégorie '$ 4 ~ "n'est pas trouvée pour la configuration / code local / [0-9] {3}. [0-9a-Z]" {Print Gensub (". * / (. *) Et client. *" "" \\ 1 ", 1, 4 $)} '.



2
votes

Vous pouvez utiliser une autre expression régulière Grep.

123.NNN
456.1


0 commentaires

0
votes

un awk à l'aide de Match () code>: xxx pré>

sortie: p> xxx pré>

joli imprimé pour un légèrement meilleur Lisibilité: P>

$ awk '
match($0,/[0-9]+\.[A-Z0-9]+/) && ++a[(b=substr($0,RSTART,RLENGTH))]==1 {
    print b
}' file


0 commentaires

1
votes

avec sed : xxx

sortie: xxx


1 commentaires

L'option -e ne fait pas partie de POSIX SED Spécification . Vous voudrez peut-être vous en prévenir.



0
votes

Un seul sed peut faire le filtrage. (Le motif peut être encore généralisé comme suggéré par d'autres personnes si c'est une option. Mais faites attention à ne pas trop simplifier la simplification afin de pouvoir correspondre à des entrées inattendues) xxx

pour remplacer votre commande exacte , xxx


2 commentaires

L'option -e ne fait pas partie de POSIX SED Spécification . Vous voudrez peut-être vous en prévenir.


et \ s / \ s Les GNU SED SEULEMENT (-E fonctionnerait-il avec OSX / BSD SED).



1
votes

J'utiliserais l'option -p:

grep -oP '/code/\K\S+' file | sort -u


0 commentaires

0
votes

Substitutions simples sur les lignes individuelles est le travail SED est le mieux adapté à. Cela fonctionnera à l'aide de tout SED dans n'importe quel shell sur n'importe quelle case UNIX:

$ cat file
John|1|R|Category is not found for local configuration/code/123.NNN and customer 113
TOM|2|R|Category is not found for local configuration/code/123.NNN and customer 114
PETER|3|R|Category is not found for local configuration/code/456.1 and customer 115

$ sed -n 's:.*Category is not found for local configuration/code/\([^ ]*\).*:\1:p' file | sort -u
123.NNN
456.1


0 commentaires