Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 1

Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 1

La línea de comandos de Bash proporciona una potencia casi ilimitada cuando se trata de ejecutar casi cualquier cosa que desee hacer. Ya sea que esté procesando un conjunto de archivos, editando un conjunto de documentos, manejando big data, administrar un sistema o automatizar una rutina, BASH puede hacerlo todo. Esta serie, de la cual hoy presentamos la primera parte, seguramente te armará con las herramientas y métodos que necesitas para convertirte en un usuario bash mucho más competente. Incluso los usuarios ya avanzados probablemente recogerán algo nuevo y emocionante. Disfrutar!

En este tutorial aprenderás:

  • Consejos, trucos y métodos de comandos de comandos útiles
  • Cómo interactuar con la línea de comandos de Bash de manera avanzada
  • Cómo afilar sus habilidades de Bash en general y convertirse en un usuario bash más competente
Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 1

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Otro Varias utilidades que se incluyen en el shell bash de forma predeterminada o se pueden instalar utilizando nombre de herramienta de instalación de sudo apt-get (donde el nombre de la herramienta representa la herramienta que desea instalar)
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Ejemplo 1: consulte a qué procesos están accediendo a un archivo determinado

¿Le gustaría saber a qué procesos están accediendo a un archivo determinado?? Es fácil hacerlo usando el fusor del comando bash integrado:

$ Fuser -a/usr/bin/gnome-calculator/usr/bin/gnome-calculator: 619672e 
$ PS -EF | GREP 619672 | GREP -V GREP ABC 619672 3136 0 13:13 ? 00:00:01 Gnome-Calcule 


Como podemos ver, el archivo /usr/bin/gnome-calculator (un binario), está siendo utilizado actualmente por el proceso con ID 619672. Verificar esa identificación del proceso usando PD, Pronto descubrimos que el usuario a B C Comenzó la calculadora y lo hizo a las 13:13.

El mi detrás de la Pid (ID de proceso) es para indicar que este es un ejecutable que se ejecuta. Hay varios otros clasificatorios de este tipo, y puedes usar fusor para verlos. Esta herramienta de fusor puede ser poderosa, especialmente cuando se usa en combinación con LSOF (un LS de archivos abiertos):

Digamos que estamos depurando una computadora remota para un usuario que está trabajando con un escritorio estándar de Ubuntu. El usuario comenzó la calculadora, y ahora su pantalla completa en Frozen. Ahora queremos matar de forma remota todos los procesos que se relacionan de cualquier manera con la pantalla bloqueada, sin reiniciar el servidor, en orden de cuán significativos son esos procesos.

# LSOF | Calculadora GREP | Grep "Compartir" | Head -N1 XDG-DESKT 3111 ABC MEM REG 253,1 3009 12327296/usr/share/locale-langpack/en_au/lc_messages/gnome calcule.mes 
# fuser -a/usr/share/locale-langpack/en_au/lc_messages/gnome-calculator.Mo/usr/share/locale-langpack/en_au/lc_messages/gnome-calculator.MO: 3111M 3136M 619672M 1577230M 
# PS -EF | GREP -E "3111 | 3136 | 619672 | 1577230" | GREP -V GREP ABC 3111 2779 0 Aug03 ? 00:00:11/usr/libexec/xdg-desktop-portal-gtk ABC 3136 2779 5 Aug03 ? 03:08:03/usr/bin/gnome-shell ABC 619672 3136 0 13:13 ? 00:00:01 Gnome-Calculator ABC 1577230 2779 0 Aug04 ? 00:03:15/usr/bin/nautilus--servicio-servicio 

Primero, localizamos todos los archivos abiertos en uso por la calculadora utilizando LSOF. Para mantener la salida corta, solo enumeramos el resultado superior para un solo archivo compartido. A continuación, usamos Fuser para averiguar qué procesos están utilizando ese archivo. Esto nos proporcionó los PID. Finalmente buscamos usando un OR (|) GreP basado para encontrar cuál nombra el proceso real. Podemos ver que mientras que la calculadora se inició a las 13:13, los otros procesos se han estado funcionando por más tiempo.

A continuación, podríamos emitir, por ejemplo, un matar -9 619672 y verifique si esto resolvió el problema. Si no, podemos probar el proceso 1577230 (el administrador de archivos nautilus compartido), proceso 3136 (la carcasa general), o finalmente procesar 3111, Aunque eso probablemente mataría una parte significativa de la experiencia de escritorio del usuario y puede no ser fácil de reiniciar.

Ejemplo 2: Depuración de sus scripts

Entonces escribió un gran script, con mucho código complejo, luego lo ejecuta ... y vea un error en la salida, que a primera vista no tiene mucho sentido. Incluso después de la depuración por un tiempo, todavía estás atrapado en lo que sucedió mientras el guión se ejecutaba.

bash -x al rescate! bash -x permite que uno ejecute un prueba.mierda guión y ver exactamente lo que sucede:

#!/bin/bash var1 = "hola linuxconfig.Org Readers!"Var2 =" ------------------------------ "echo $ var1 echo $ var2 
Copiar

Ejecución:

$ bash -x ./prueba.sh + var1 = "hola linuxconfig.Org Readers!" + Var2 = ------------------------------ + echo hola linuxconfig.Org 'lectores!'Hola LinuxConfig.Org Readers! + eco ------------------------------ ------------------------------ 

Como puedes ver, el bash -x El comando nos mostró exactamente lo que sucedió, paso a paso. También puede enviar la salida de este comando a un archivo fácilmente agregando 2> y 1 | Tee my_output.registro al comando:

$ bash -x ./prueba.sh 2> y 1 | Tee my_output.Registro ... la misma salida ... $ Cat my_output.log + var1 = "hola linuxconfig.Org Readers!" + Var2 = ------------------------------ + echo hola linuxconfig.Org 'lectores!'Hola LinuxConfig.Org Readers! + eco ------------------------------ ------------------------------ 


El 2> y 1 enviará el stderr (salida de error estándar: cualquier error visto durante la ejecución) a stdout (Salida estándar: definida libremente aquí como la salida que generalmente ve en el terminal) y captura toda la salida de bash -x. El tee El comando capturará toda la salida de stdout, y escríbalo en el archivo indicado. Si alguna vez desea agregar a un archivo (y no comenzar de nuevo con un archivo vacío) puede usar Tee -A donde el -a La opción asegurará que el archivo se agrega a.

Ejemplo 3: Una gotcha común: sh -x != bash -x

El último ejemplo nos mostró cómo usar bash -x, pero también podríamos usar sh -x? La tendencia de algunos usuarios más nuevos de BASH puede ser ejecutar sh -x, Pero este es un error de novato; mierda es un caparazón mucho más limitado. Mientras que intento está basado en mierda, tiene muchas más extensiones. Así, si usas sh -x Para depurar sus scripts, verá errores extraños. Quiero ver un ejemplo?

#!/bin/bash test = "abc" if [["$ test" == * "b" *]]; Entonces hacer eco "Sí, allí!"Fi 
Copiar

Ejecución:

ps ./prueba.SH si, allí! 
$ bash -x ./prueba.sh + test = ABC + [[ABC == * \ B *]] + echo 'Sí, allí!'Sí, allí! 
$ sh -x ./prueba.sh + test = ABC + [[ABC == * B *]] ./Prueba: 4: [[: No se encuentra 

Aquí puedes ver un pequeño script de prueba prueba.mierda que cuando se ejecuta verifica si una determinada letra (b) aparece en una determinada cadena de entrada (según lo definido por el PRUEBA variable). El guión funciona muy bien, y cuando usamos bash -x Podemos ver la información presentada, incluida la salida, se ve correcta.

A continuación, usando sh -x Las cosas salen significativamente mal; el mierda el shell no puede interpretar [[ y falla ambos en el sh -x salida, así como en la ejecución del script en sí. Esto se debe a que la sintaxis avanzada si se implementa en intento no existe en mierda.

Ejemplo 4: Uniq o no único: esa es la pregunta!

¿Alguna vez ha querido clasificar un archivo y solo enumerar las entradas únicas?? A primera vista, este parecería ser un ejercicio fácil usando el comando bash incluido uniq:

Input $ Cat.txt 1 2 2 3 3 3 
Input $ Cat.txt | uniq 1 2 3 

Sin embargo, si modificamos un poco nuestro archivo de entrada, nos encontramos con problemas de singularidad:

Input $ Cat.txt 3 1 2 3 2 3 3 3 
Input $ Cat.txt | Uniq 3 1 2 3 2 3 


Esto es porque uniq Por defecto lo hará Filtro de líneas coincidentes adyacentes, con líneas coincidentes que se fusionan hasta la primera ocurrencia como el uniq Manual aclara. O en otras palabras, solo se eliminarán las líneas que son exactamente las mismas que las anteriores.

En el ejemplo, esto puede ser visto por los últimos tres 3 líneas que se condensan en un solo 'único' 3. Es probable que esto solo sea utilizable en un número limitado y casos de uso específicos.

Sin embargo, podemos ajustar uniq un poco más para darnos solo entradas verdaderamente únicas usando el -u parámetro:

Input $ Cat.txt # Tenga en cuenta que los símbolos ' #' se agregaron después de la ejecución, para aclarar algo (lea a continuación) 3 # 1 # 2 # 3 # 2 # 3 3 3 
Input $ Cat.txt | uniq -u 3 1 2 3 2 

Todavía se ve un poco confuso, bien? Mire de cerca la entrada y la salida y puede ver cómo son las solo líneas que son individualmente único (como marcado por # en el ejemplo anterior después de la ejecución) se emiten.

Los últimos tres 3 Las líneas no se emiten como no son único como tal. Este método de singularidad nuevamente tendría una aplicabilidad limitada en los escenarios del mundo real, aunque puede haber algunos casos en los que es útil.

Podemos obtener una solución más adecuada para la singularidad mediante el uso de una herramienta incorporada de Bash ligeramente diferente; clasificar:

Input $ Cat.txt 1 2 2 3 3 3 
Input $ Cat.txt | Sort -u 1 2 3 
SABÍAS?
Puedes omitir el gato comandar en los ejemplos anteriores y proporcionar archivo a uniq o clasificar leer directamente? Ejemplo:Sort -u Entrada.TXT

Excelente! Esto se puede utilizar en muchos script donde nos gustaría una verdadera lista de entradas únicas. El beneficio adicional es que la lista está bien ordenada al mismo tiempo (aunque es posible que hubiéramos preferido usar el -norte Opción para ordenar también para ordenar en un orden numérico de acuerdo con el valor numérico de la cadena).

Conclusión

Hay mucha alegría en usar bash como su línea de comando Linux preferida. En este tutorial, exploramos una serie de útiles consejos y trucos de línea de comandos de Bash. Este es el inicio de una serie llena de ejemplos de línea de comandos bash que, si lo sigue, lo ayudará a ser mucho más avanzado en y con la línea de comandos de bash y el shell!

Háganos saber sus pensamientos y comparta algunos de sus propios consejos de línea de comando Cool Bash, trucos y gotchas a continuación!

  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 1
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 2
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 3
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 4
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 5

Tutoriales de Linux relacionados:

  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 3
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 2
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 4
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Ubuntu 20.04 trucos y cosas que quizás no sepas
  • Ejemplos de consejos y trucos de comandos de comandos útiles - Parte 5
  • Manipulación de Big Data para la diversión y las ganancias Parte 1
  • Consejos y trucos de la línea de comandos de Bash
  • Ubuntu 20.04 Guía
  • Bucles anidados en guiones Bash