GNU/Linux >> Tutoriales Linux >  >> Linux

Comando Uniq en Linux explicado con ejemplos

Aprende a usar el comando uniq en Unix y Linux con estos ejemplos prácticos.

El comando uniq en Unix y Linux se usa para filtrar texto duplicado. Se puede usar solo, pero se usa comúnmente junto con otros comandos, como identificar información redundante en un archivo.

Esta es la sintaxis del comando uniq:

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

Cuando ejecuta uniq sin opciones, utilizará stdin y stdout para entrada y salida.

Si bien es posible usar stdin usando el portapapeles (copiar/pegar), este no es el uso más práctico.

En su lugar, probablemente desee utilizar este comando en un archivo que sospeche que contiene información duplicada.

Una limitación del comando uniq es que solo identificará los duplicados que estén adyacentes o uno al lado del otro en el archivo. Esto es bastante sencillo, pero déjame mostrarte un ejemplo para que puedas verlo en acción.

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

Entonces, sabe de inmediato que no puede confiar en que el programa identifique cada duplicado por sí solo. Hay algunas formas de evitar esto y normalmente es con el comando ordenar.

Te lo mostraré más adelante en este artículo. Primero, déjame repasar algunos ejemplos para familiarizarte con 'uniq' antes de mezclar otros comandos y potencialmente confundir las cosas.

7 ejemplos del comando uniq en Linux

Usé un registro del sistema real, pero lo edité con fines de demostración. La mayor parte del archivo ya se ha clasificado en orden adyacente, pero he dejado un par de líneas "fuera de lugar" para mostrar la funcionalidad del comando uniq.

https://gist.github.com/abhishekpc/7dada8c6e57fd5b854f9d2dae72dddb0DESCARGAR ARCHIVO DE TEXTO DE MUESTRA

Ejemplo 1:Usar el comando uniq de forma predeterminada

Aunque ya te mostré esto, veamos nuestro archivo de muestra usando la sintaxis predeterminada.

[[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

Puede ver que muchas de las líneas duplicadas están consolidadas, pero todavía tiene información redundante. Esto se debe a la limitación funcional que ya describí. Veamos algunos ejemplos más y examinemos algunas de las opciones integradas en la utilidad de línea de comandos 'uniq'.

Ejemplo 2:enviar resultados filtrados al archivo de destino

Es posible que desee guardar esta salida para poder editarla o conservarla fácilmente. Puede dirigir nuestra salida a un archivo separado en lugar de la salida estándar normal (terminal). Es importante tener en cuenta que no puede usar este formato para anular el archivo original.

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

Este es el contenido del archivo de salida:

[[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

Ejemplo 3:Usar '-c' para obtener el recuento de líneas repetidas

Esta opción se explica por sí misma. El programa agregará el conteo al comienzo de cada línea.

[[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

Ejemplo 4:Solo imprime líneas repetidas con '-d'

Como puede ver, solo se muestran las líneas que están duplicadas en todo el archivo, si usa la opción -d del comando 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

Ejemplo 5:solo imprime líneas únicas con '-u'

Aquí, obtienes la salida inversa del comando anterior. Ninguno de estos comandos se repite en el archivo.

[[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

Ejemplo 6:Ignorar campos o caracteres con uniq ['-f' y '-s']

Estos son realmente dos ejemplos, pero las funciones son casi idénticas. Explicaré cómo funcionan y luego aclararé las diferencias entre los dos.

Cada uno de ellos usa la siguiente sintaxis

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

En cada uno de estos ejemplos, 'N' es la cantidad de elementos que desea omitir. Cuando omita esta cantidad de elementos, uniq comenzará la comparación en ese punto en lugar de comparar toda la línea.

La opción 'f' omitirá el número de campos asignado. Los campos se interpretarán usando el espacio en blanco.

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

Si desea utilizar el comando uniq en la segunda columna, deberá omitir el primer campo de esta manera:

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

Como puede ver, toma tanto 'pez rojo' como 'pez verde' como la misma línea porque el primer campo (con colores) ha sido ignorado. Si usa la opción de conteo aquí, le mostrará el conteo de las líneas únicas que ha encontrado:

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

¿Por qué necesitarías esto? Te daré un escenario práctico. Muchos archivos de registro tienen la marca de tiempo al comienzo de las líneas. Si busca encontrar solo las líneas únicas en dicho archivo, puede omitir el primer campo con la marca de tiempo con la opción -f.

Del mismo modo, puede omitir un número específico de caracteres.

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

Ejemplo 7:Use '-w' para comparar solo N caracteres

La opción '-w' nos permite especificar un número exacto de caracteres para usar en nuestra comparación.

Si usó el archivo de registro para los dos ejemplos anteriores, está bien. Quería simplificar un poco el texto de comparación para limitar la confusión. Si no es así, recuperémoslo y veamos qué sucede cuando usas solo el primero de los caracteres para encontrar duplicados.

[[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

Todas las líneas que comienzan con '/usr' ahora se identifican como "iguales" desde la perspectiva del programa.

Esto puede resultar útil si está buscando un evento de registro en particular.

Bonificación:Evite las coincidencias incompletas usando 'sort' y 'uniq' al mismo tiempo.

Puede ejecutar estos comandos por separado para lograr el mismo efecto, pero si nunca ha usado una tubería (el carácter |) en Linux, esta es una excelente manera de aprender sobre ellos.

Puede usar tuberías para combinar diferentes comandos para ahorrarnos pulsaciones de teclas y mejorar nuestro flujo de trabajo. Los comandos se ejecutarán en el orden en que se escriben.

Esta es la entrada de muestra que voy a usar:

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

Ahora, ordenemos el archivo de entrada y luego usemos el comando uniq en él. El comando ordenar reorganiza el texto para que todos los elementos estén en orden adyacente primero. Luego, cuando se ejecuta el comando uniq, encuentra solo 3 líneas únicas en el archivo.

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

Si inviertes el orden, las cosas cambiarán. Ejecutar el comando 'uniq' primero identificará solo los duplicados adyacentes, y luego cada uno se clasificará en orden alfabético usando el comando 'ordenar'.

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

Las canalizaciones nos permiten ejecutar varios comandos al mismo tiempo, pero es importante tener en cuenta su orden.

Tenga en cuenta que el contenido del archivo permanece sin cambios tal como lo haría al ejecutar los comandos individualmente. Conectar los dos comandos juntos también mantiene los resultados en la "memoria" del sistema. Si los ejecutó por separado, no podría obtener estos resultados a menos que creara un archivo nuevo y lo usara para sobrescribir el contenido del original antes de ejecutar su segundo comando.

Conclusión

Como puede imaginar, eso hace que este sea un concepto importante en el aprendizaje de bash. Estos comandos particulares (sort y uniq) a menudo se usan juntos para filtrar rápidamente información de archivos grandes como nuestro pseudo-log.


Linux
  1. Comando de apagado de Linux explicado con ejemplos

  2. Comando nslookup de Linux explicado con ejemplos

  3. Comando Traceroute de Linux, explicado con ejemplos

  4. Comando whoami en Linux explicado con ejemplos

  5. Comando Ping de Linux explicado con ejemplos

Comando Tr en Linux explicado con ejemplos

w Comando explicado con ejemplos en Linux

Comando de espera en Linux explicado con ejemplos prácticos

Comando Tee en Linux explicado con ejemplos

Explicación del comando tee de Linux (con ejemplos)

Explicación del comando csplit de Linux (con ejemplos)