unix - resueltos - scripts bash ejemplos
Los ejemplos más potentes de comandos o scripts de Unix que todo programador debe saber (25)
Hay muchas cosas que todos los programadores deberían saber, pero estoy particularmente interesado en los comandos de Unix / Linux que todos deberíamos saber. Para llevar a cabo tareas que nos podemos enfrentar en algún momento, como refactorización , informes , actualizaciones de red , etc.
La razón por la que tengo curiosidad es porque, habiendo trabajado previamente como probador de software en una compañía de software mientras estudio mi licenciatura, noté que todos los desarrolladores (que estaban desarrollando software de Windows) tenían 2 computadoras.
A su izquierda estaba su máquina de desarrollo de Windows XP, y a la derecha había una caja de Linux. Creo que fue Ubuntu. De todos modos me dijeron que lo usaban porque proporcionaba poderosas operaciones de Unix que Windows no podía hacer en su proceso de desarrollo.
Esto me da curiosidad por saber, como ingeniero de software, cuáles cree usted que son algunos de los scripts / comandos / usos más potentes que puede realizar en un sistema operativo Unix / Linux que todo programador debe saber para resolver tareas del mundo real que quizás no ¿necesariamente se relaciona con escribir código?
Todos sabemos lo que hacen sed , awk y grep . Estoy interesado en algunas piezas de scripting de Unix / Linux reales que le han resuelto un problema difícil, para que otros programadores se beneficien. Por favor, brinde su historia y fuente.
Estoy seguro de que hay numerosos ejemplos como este que la gente guarda en su carpeta " Scripts ".
Actualización: la gente parece estar malinterpretando la pregunta. No estoy pidiendo los nombres de los comandos individuales de Unix, en vez de los fragmentos de código UNIX que han resuelto un problema para usted.
Las mejores respuestas de la comunidad
Recorre un árbol de directorios e imprime rutas a cualquier archivo que coincida con una expresión regular:
find . -exec grep -l -e ''myregex'' {} /; >> outfile.txt
Invocar el editor predeterminado (Nano / ViM)
(funciona en la mayoría de los sistemas Unix, incluido Mac OS X) El editor predeterminado es el que tenga configurada la variable de entorno " EDITOR ". es decir: export EDITOR = / usr / bin / pico que se encuentra en ~ / .profile bajo Mac OS X.
Ctrl+x Ctrl+e
Enumera todas las conexiones de red en ejecución (incluida la aplicación a la que pertenecen)
lsof -i -nP
Borrar el historial de búsqueda de la Terminal (Otro de mis favoritos)
history -c
Cómo salir de VI
: wq
Guarda el archivo y finaliza la miseria.
La alternativa de " :wq
" es " :x
" para guardar y cerrar el editor vi.
Al resolver problemas en los cuadros de Linux defectuosos, la secuencia de teclas más común que escribo terminan escribiendo es alt + sysrq REISUB
El poder de estas herramientas (grep find, awk, sed) proviene de su versatilidad, por lo que dar un caso particular parece bastante inútil.
El hombre es el comand más poderoso, porque entonces puedes entender lo que escribes en lugar de simplemente copiar ciegamente pegar desde el desbordamiento de la pila.
El ejemplo es bienvenido, pero ya hay temas para tis. Mi más utilizado:
grep something_to_find * -R
que puede ser reemplazado por ack y
find | xargs
encontrar con resultados conectados a xargs puede ser muy poderoso
Grep (prueba Windows Grep )
sed (prueba Sed para Windows)
De hecho, hay un gran conjunto de puertos de comandos * nix realmente útiles disponibles en http://gnuwin32.sourceforge.net/ . Si tiene un fondo * nix y ahora usa Windows, probablemente debería verificarlos.
Más o menos, pero puedes obtener Powershell en Windows. Es realmente poderoso y puede hacer muchas cosas del tipo * nix. Una buena diferencia es que trabajas con objetos .net en lugar de texto, lo que puede ser útil si estás utilizando la canalización para filtrar, etc.
Alternativamente, si no necesita la integración de .NET, instale Cygwin en el cuadro de Windows. (Y agregue su directorio a la RUTA de Windows).
Mi favorito personal es el comando lsof.
"lsof" se puede utilizar para enumerar descriptores de archivos abiertos, sockets y pipes. Lo encuentro extremadamente útil cuando trato de averiguar qué procesos han usado qué puertos / archivos en mi máquina.
Ejemplo: enumere todas las conexiones de Internet sin resolución de nombre de host y sin conversión de puerto a puerto.
lsof -i -nP
Puedes hacer cualquier cosa con esto ...
gcc
Sería mejor si mantienes una hoja de trucos contigo ... no hay un solo comando que se pueda llamar más útil. Si un comando perticular hace su trabajo es útil y poderoso
¿Quieres editar poderosos scripts de shell? los scripts de shell son programas. Obtenga los conceptos básicos correctos, construya en comandos individuales y obtendrá lo que se llama un poderoso script. El que sirve su necesidad es poderoso, de lo contrario es inútil. Hubiera sido mejor que mencionaras un problema y le preguntaras cómo resolverlo.
Tu caparazón es la herramienta más poderosa que tienes disponible
- ser capaz de escribir bucles simples, etc.
- comprensión del archivo globbing (ej. * .java etc.)
- ser capaz de armar comandos a través de tuberías, subcapas. redirección, etc.
Tener ese nivel de conocimiento del caparazón le permite hacer enormes cantidades en la línea de comando, sin tener que registrar información a través de archivos de texto temporales, copiar / pegar, etc., y aprovechar la gran cantidad de programas de utilidad que permiten dividir / cortar los datos .
Unix Power Tools te mostrará mucho de esto. Cada vez que abro mi copia, encuentro algo nuevo.
Una forma de buscar (múltiples) archivos de registro mal formateados, en los que la cadena de búsqueda se puede encontrar en una línea "huérfana". Por ejemplo, para mostrar tanto la 1ª como una 3ª y 4ª líneas concatenadas cuando busquen id = 110375:
[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception
...; id = 110375; ...
[2008-11-08 07:07:05] [INFO] ...; id = 800612; ...
Supongo que debe haber mejores soluciones ( sí, agrégalas ...! ) Que la siguiente concatenación de las dos líneas que usan sed
antes de ejecutar realmente grep
:
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage: `basename $0` id"
echo "Searches all myproject''s logs for the given id"
exit -1
fi
# When finding "caught exception" then append the next line into the pattern
# space bij using "N", and next replace the newline with a colon and a space
# to ensure a single line starting with a timestamp, to allow for sorting
# the output of multiple files:
ls -rt /var/www/rails/myproject/shared/log/production.* /
| xargs cat | sed ''/caught exception$/N;s//n/: /g'' /
| grep "id = $1" | sort
... ceder:
[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...
En realidad, una solución más genérica agregaría todas las líneas (posiblemente múltiples) que no comiencen con alguna [marca de tiempo] a su línea anterior. ¿Nadie? No necesariamente usando sed
, por supuesto.
algunos de ustedes pueden estar en desacuerdo conmigo, pero sin embargo, aquí hay algo de qué hablar. Si uno aprende gawk (otras variantes también) a fondo, uno puede omitir el aprendizaje y el uso de grep / sed / wc / cut / paste y algunas otras herramientas * nix. todo lo que necesitas es una buena herramienta para hacer el trabajo de muchos combinados.
for card in `seq 1 8` ;do
for ts in `seq 1 31` ; do
echo $card $ts >>/etc/tuni.cfg;
done
done
era mejor que escribir las tontas 248 líneas de configuración a mano.
Estaba obligado a dejar caer algunas tablas sobrantes que tenían el prefijo ''tmp''
for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do
echo drop table $table
done
Revise la salida, vuelva a ejecutar el ciclo y canalícelo a mysql
- grep
- awk
- sed
- Perl
- encontrar
Gran parte de la potencia de Unix proviene de su capacidad para manipular archivos de texto y filtrar datos. Por supuesto, puede obtener todos estos comandos para Windows. Simplemente no son nativos en el sistema operativo, como lo son en Unix.
y la capacidad de encadenar comandos junto con tuberías, etc. Esto puede crear líneas únicas de comandos extremadamente potentes a partir de funciones simples.
Considero que commandlinefu.com es un excelente recurso para varias recetas de scripts de shell.
Ejemplos
Común
# Run the last command as root
sudo !!
# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x ctrl-e
# Execute a command at a given time
echo "ls -l" | at midnight
Esotérico
# output your microphone to a remote computer''s speaker
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
Cuando las cosas funcionan en un servidor pero están dañadas en otro, lo siguiente le permite comparar todas las bibliotecas relacionadas:
export MYLIST=`ldd amule | awk '' { print $3; }''`; for a in $MYLIST; do cksum $a; done
Compare esta lista con la que está entre las máquinas y puede aislar las diferencias rápidamente.
El comando tr es el comando menos apreciado en Unix:
#Convert all input to upper case
ls | tr a-z A-Z
#take the output and put into a single line
ls | tr "/n" " "
#get rid of all numbers
ls -lt | tr -d 0-9
El hecho de que puedas usar -name y -iname varias veces en un comando de búsqueda me abrió los ojos.
[findplaysong.sh]
#!/bin/bash
cd ~
echo Matched...
find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec echo {} /;
echo Sleeping 5 seconds
sleep 5
find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec mplayer {} /;
exit
Encontrar PIDs sin que aparezca el grep
export CUPSPID=`ps -ef | grep cups | grep -v grep | awk ''{print $2;}''`
Lo uso tanto que en realidad estoy avergonzado de mí mismo. Elimine los espacios de todos los nombres de archivo y reemplácelos con un guión bajo:
[removevespaces.sh]
#!/bin/bash
find . -type f -name "* *" | while read file
do
mv "$file" "${file// /_}"
done
Para ejecutar en paralelo varios procesos sin sobrecargar demasiado la máquina (en una arquitectura multiprocesador):
NP=`cat /proc/cpuinfo | grep processor | wc -l`
#your loop here
if [ `jobs | wc -l` -gt $NP ];
then
wait
fi
launch_your_task_in_background&
#finish your loop here
Si comete un error tipográfico en un comando largo, puede volver a ejecutar el comando con una sustitución (en bash):
mkdir ~/aewseomeDirectory
puede ver que "impresionante" está mal escrito, puede escribir lo siguiente para volver a ejecutar el comando con el error corregido
^aew^awe
luego emite lo que sustituyó (mkdir ~/aweseomeDirectory
) y ejecuta el comando. (¡No olvides deshacer el daño que hiciste con el comando incorrecto!)
Las mejores respuestas de la comunidad
Recorre un árbol de directorios e imprime rutas a cualquier archivo que coincida con una expresión regular:
find . -exec grep -l -e ''myregex'' {} /; >> outfile.txt
Invocar el editor predeterminado (Nano / ViM)
(funciona en la mayoría de los sistemas Unix, incluido Mac OS X) El editor predeterminado es el que tenga configurada la variable de entorno " EDITOR ". es decir: export EDITOR = / usr / bin / pico que se encuentra en ~ / .profile bajo Mac OS X.
Ctrl+x Ctrl+e
Enumera todas las conexiones de red en ejecución (incluida la aplicación a la que pertenecen)
lsof -i -nP
Borrar el historial de búsqueda de la Terminal (Otro de mis favoritos)
history -c
Comience todos los servicios web
find -iname ''*weservice*''|xargs -I {} service {} restart
Buscar una clase local en el subdirectorio java
find -iname ''*.java''|xargs grep ''class Pool''
Encuentre todos los elementos del archivo recursivamente en los subdirectorios de la ruta actual:
cat searches.txt| xargs -I {} -d, -n 1 grep -r {}
PS searches.txt: primero, segundo, tercero, ..., millones
Repite tu comando anterior en bash usando !!
. A menudo corro chown otheruser: -R /home/otheruser
y olvido usar sudo. Si te olvidas de sudo, usando !! es un poco más fácil que la flecha arriba y luego el hogar.
sudo !!
iptables -nL --line-numbers
nombres de host y los nombres de puertos resueltos automáticamente, así que guardo un alias para iptables mapeado a iptables -nL --line-numbers
. Ni siquiera estoy seguro de por qué los números de línea están ocultos por defecto.
Finalmente, si desea verificar si un proceso está escuchando en un puerto como debería, enlazado a la dirección correcta, puede ejecutar
netstat -nlp
Luego puede grep el nombre del proceso o el número de puerto (-n le da el valor numérico).
También me gusta tener la ayuda de colores en la terminal. Me gusta agregar esto a mi bashrc para recordarme si soy root sin siquiera tener que leerlo. Esto realmente me ayudó mucho, nunca más me olvido de sudo.
red=''/033[1;31m''
green=''/033[1;32m''
none=''/033[0m''
if [ $(id -u) -eq 0 ];
then
PS1="[/[$red/]/u/[$none/]@/H /w]$ "
else
PS1="[/[$green/]/u/[$none/]@/H /w]$ "
fi
Esos son todos comandos muy simples, pero los uso mucho. La mayoría de ellos incluso merecía un alias en mis máquinas.