GNU/Linux >> Tutoriels Linux >  >> Linux

La commande Uniq sous Linux expliquée avec des exemples

Apprenez à utiliser la commande uniq sous Unix et Linux grâce à ces exemples pratiques.

La commande uniq sous Unix et Linux est utilisée pour filtrer le texte en double. Il peut être utilisé seul, mais il est couramment utilisé avec d'autres commandes telles que l'identification d'informations redondantes dans un fichier.

Voici la syntaxe de la commande uniq :

uniq [options] <input-file> <output-file>

Lorsque vous exécutez uniq sans options, il utilisera stdin et stdout pour l'entrée et la sortie.

Bien que l'utilisation de stdin soit possible à l'aide du presse-papiers (copier/coller), ce n'est pas l'utilisation la plus pratique.

Au lieu de cela, vous voudrez probablement utiliser cette commande sur un fichier qui, selon vous, contient des informations en double.

Une limitation de la commande uniq est qu'elle n'identifiera que les doublons adjacents ou côte à côte dans le fichier. C'est assez simple, mais laissez-moi vous montrer un exemple pour que vous puissiez le voir en action.

[[email protected] ~]$ cat apple.txt
apple
apple
orange
orange
apple 
orange
[[email protected] ~]$ uniq apple.txt 
apple
orange
apple 
orange

Ainsi, vous savez tout de suite que vous ne pouvez pas faire confiance au programme pour identifier chaque doublon par lui-même. Il y a plusieurs façons de contourner cela et normalement c'est avec la commande sort.

Je vous le montrerai plus tard dans cet article. Tout d'abord, laissez-moi parcourir quelques exemples pour vous familiariser avec "uniq" avant de mélanger d'autres commandes et des choses potentiellement déroutantes.

7 exemples de la commande uniq sous Linux

J'ai utilisé un vrai journal système mais je l'ai édité à des fins de démonstration. La majeure partie du fichier a déjà été triée dans l'ordre adjacent, mais j'ai laissé quelques lignes "hors de propos" pour montrer la fonctionnalité de la commande uniq.

https://gist.github.com/abhishekpc/7dada8c6e57fd5b854f9d2dae72dddb0TÉLÉCHARGER UN EXEMPLE DE FICHIER TEXTE

Exemple 1 :Utilisation de la commande uniq par défaut

Bien que je vous ai déjà montré cela, regardons notre exemple de fichier en utilisant la syntaxe par défaut.

[[email protected] ~]$ uniq sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Vous pouvez voir qu'un grand nombre de lignes en double sont consolidées, mais qu'elles contiennent toujours des informations redondantes. Cela est dû à la limitation fonctionnelle que j'ai déjà décrite. Examinons quelques exemples supplémentaires et examinons certaines des options intégrées à l'utilitaire de ligne de commande "uniq".

Exemple 2 :sortie des résultats filtrés dans le fichier de destination

Vous souhaiterez peut-être enregistrer cette sortie afin de pouvoir la modifier ou la conserver facilement. Vous pouvez diriger notre sortie vers un fichier séparé au lieu du stdout normal (terminal). Il est important de noter que vous ne pouvez pas utiliser ce format pour remplacer le fichier d'origine.

[[email protected] ~]$ uniq sample_log_file.txt uniq_log_output.txt 

Voici le contenu du fichier de sortie :

[[email protected] ~]$ cat uniq_log_output.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Exemple 3 : Utilisation de "-c" pour obtenir le nombre de lignes répétées

Cette option est assez explicite. Le programme ajoutera le décompte au début de chaque ligne.

[[email protected] ~]$ uniq sample_log_file.txt -c
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
      5 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
      7 /usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
      1 PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
      8 wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Exemple 4 :n'imprime que les lignes répétées avec '-d'

Comme vous pouvez le voir, seules les lignes dupliquées dans le fichier sont affichées, si vous utilisez l'option -d de la commande uniq.

[[email protected] ~]$ uniq sample_log_file.txt -d
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Exemple 5 :Imprimez uniquement les lignes uniques avec '-u'

Ici, vous obtenez la sortie inverse de la commande précédente. Aucune de ces commandes n'est répétée dans le fichier.

[[email protected] ~]$ uniq sample_log_file.txt -u
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms

Exemple 6 :Ignorer les champs ou les caractères avec uniq ['-f' et '-s']

Il s'agit en fait de deux exemples, mais les fonctions sont presque identiques. Je vais expliquer comment ils fonctionnent, puis clarifier les différences entre les deux.

Chacun d'eux utilise la syntaxe suivante

Skip fields with:
uniq <source_file> -f N
Skip characters with:
uniq <source_file> -s N

Dans chacun de ces exemples, "N" est le nombre d'éléments que vous souhaitez ignorer. Lorsque vous sautez ce nombre d'éléments, uniq commencera la comparaison à ce point plutôt que de comparer la ligne entière.

L'option « f » ignorera le nombre de champs attribué. Les champs seront interprétés en utilisant l'espace vide.

[[email protected] ~]$ cat field_separated_values.txt 
blue fish
blue fish
blue fish
blue class
red fish
green fish
two class
two class

Si vous souhaitez utiliser la commande uniq sur la deuxième colonne, vous devrez ignorer le premier champ comme ceci :

[[email protected] ~]$ uniq -f1 field_separated_values.txt  
blue fish
blue class
red fish
two class

Comme vous pouvez le voir, il prend à la fois « poisson rouge » et « poisson vert » comme la même ligne car le premier champ (avec des couleurs) a été ignoré. Si vous utilisez l'option count ici, il vous montrera le nombre de lignes uniques qu'il a trouvées :

[[email protected] ~]$ uniq -f1 -c field_separated_values.txt  
      3 blue fish
      1 blue class
      2 red fish
      2 two class

Pourquoi auriez-vous besoin de ça ? Je vais vous donner un scénario pratique. De nombreux fichiers journaux ont l'horodatage au début des lignes. Si vous cherchez à trouver uniquement les lignes uniques dans un tel fichier, vous pouvez ignorer le premier champ avec l'horodatage avec l'option -f.

De même, vous pouvez ignorer un nombre spécifique de caractères.

[[email protected] ~]$ uniq -s 10 field_separated_values.txt 
blue    fish

Exemple 7 :Utilisez '-w' pour comparer uniquement N caractères

L'option '-w' nous permet de spécifier un nombre exact de caractères à utiliser dans notre comparaison.

Si vous avez utilisé le fichier journal pour les deux exemples précédents, c'est très bien. Je voulais rendre le texte de comparaison un peu plus simple pour limiter la confusion. Si ce n'est pas le cas, reprenons-le et voyons ce qui se passe lorsque vous n'utilisez que le premier caractère pour trouver des doublons.

[[email protected] ~]$ uniq -w 4 sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Toutes les lignes qui commencent par "/usr" sont maintenant identifiées comme "identiques" du point de vue du programme.

Cela peut s'avérer utile si vous recherchez un événement de journal particulier.

Bonus :évitez les correspondances incomplètes en utilisant 'sort' et 'uniq' en même temps.

Vous pouvez exécuter ces commandes séparément pour obtenir le même effet, mais si vous n'avez jamais utilisé de tube (le caractère |) sous Linux, c'est un excellent moyen d'en apprendre davantage.

Vous pouvez utiliser des tuyaux pour combiner différentes commandes afin de nous épargner des frappes et d'améliorer notre flux de travail. Les commandes seront exécutées dans l'ordre dans lequel elles sont saisies.

Voici l'exemple d'entrée que je vais utiliser :

[[email protected] ~]$ cat apple.txt 
apple
orange
orange
apple
apple
banana
apple
banana

Maintenant, trions le fichier d'entrée, puis utilisons la commande uniq dessus. La commande de tri réorganise le texte de sorte que tous les éléments soient dans l'ordre adjacent en premier. Ensuite, lorsque la commande uniq est exécutée, elle ne trouve que 3 lignes uniques dans le fichier.

[[email protected] ~]$ sort apple.txt | uniq 
apple
banana
orange

Si vous inversez l'ordre, les choses changeront. Exécuter d'abord la commande "uniq" n'identifiera que les doublons adjacents, puis ils seront chacun triés par ordre alphabétique à l'aide de la commande "sort".

[[email protected] ~]$ uniq apple.txt | sort
apple
apple
apple
banana
banana
orange

Les pipes nous permettent d'exécuter plusieurs commandes en même temps, mais il est important de tenir compte de leur ordre.

Notez que le contenu du fichier reste inchangé, comme il le ferait lors de l'exécution des commandes individuellement. L'association des deux commandes conserve également les résultats dans la "mémoire" du système. Si vous les exécutiez séparément, vous ne pourriez pas obtenir ces résultats à moins de créer un nouveau fichier et de l'utiliser pour écraser le contenu de l'original avant d'exécuter votre deuxième commande.

Conclusion

Comme vous pouvez l'imaginer, cela en fait un concept important dans l'apprentissage de bash. Ces commandes particulières (sort et uniq) sont souvent utilisées ensemble pour filtrer rapidement les informations de fichiers volumineux comme notre pseudo-log.


Linux
  1. Commande d'arrêt Linux expliquée avec des exemples

  2. Commande Linux nslookup expliquée avec des exemples

  3. Commande Linux Traceroute, expliquée avec des exemples

  4. La commande whoami sous Linux expliquée avec des exemples

  5. La commande Linux Ping expliquée avec des exemples

Commande Tr sous Linux expliquée avec des exemples

w Commande expliquée avec des exemples sous Linux

La commande Wait sous Linux expliquée avec des exemples pratiques

La commande Tee sous Linux expliquée avec des exemples

Explication de la commande Linux tee (avec exemples)

La commande Linux csplit expliquée (avec des exemples)