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 b> et le client 113
Tom | 2 | R | La catégorie n'est pas trouvée pour la configuration / code local / 123.nnn b> et le client 114
Peter | 3 | R | La catégorie n'est pas trouvée pour la configuration / code / 456.1 B> et le client 115 p>
J'ai besoin d'extraire uniquement le texte en surbrillance ci-dessus à l'aide du 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. P> sortie en cours: p> Sortie attendue : p> grep < / code> commande. P>
8 Réponses :
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
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é> où 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>
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é.
Votre regex spécifie une largeur de caractère fixe pour les chaînes de largeur variable. Basé sur vos exemples, quelque chose comme semble être une meilleure regex. Cependant, nous pourrions probablement aussi simplifier cela en fusionnant les commandes Les deux AVIS également comment La variante de regex supportée par AWK est légèrement différente de celle prise en charge. par POSIX Cut code> et multiple
grep code> dans un seul script awk. P>
Split code> Les opérations sont juste un moyen peu coûteux de choisir le texte entre
/ code / 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 / code> correspond au motif que nous suivons. p>
Trier code> a une option
-u code> qui vous permet de remplacer (cas triviaux de)
UNIQ code>. p>
GREP code>; Donc, le backslashed
\ + code> dans
grep code> s BRE BREAL est la simple
+ code> dans la dialecte appelée ere qui est [plus ou moins] prise en charge par awk - et
grep -e code>. Si vous avez
grep -p code>, vous pouvez utiliser une troisième variante qui a une fonctionnalité pratique; p>
\ k code> Dit "Match jusqu'à présent, mais tout oublie tout avant" et imprime donc la partie après ce jeton. p> p>
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 $)} ' code>.
Vous pouvez utiliser une autre expression régulière Grep.
123.NNN 456.1
un awk à l'aide de sortie: p> joli imprimé pour un légèrement meilleur Lisibilité: P> Match () code>:
$ awk '
match($0,/[0-9]+\.[A-Z0-9]+/) && ++a[(b=substr($0,RSTART,RLENGTH))]==1 {
print b
}' file
avec sortie: p> sed code>:
L'option -e code> ne fait pas partie de POSIX SED Spécification . Vous voudrez peut-être vous en prévenir.
Un seul pour remplacer votre commande exacte , p> sed code> 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)
L'option -e code> ne fait pas partie de POSIX SED Spécification . Vous voudrez peut-être vous en prévenir.
et \ s / \ s code> Les GNU SED SEULEMENT (-E fonctionnerait-il avec OSX / BSD SED).
J'utiliserais l'option -p:
grep -oP '/code/\K\S+' file | sort -u
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