¿Cuáles son las frases más útiles de “navaja suiza” en Unix? Es decir, ¿cuál es tu comando favorito de una sola línea que hace el trabajo de un programa mucho más detallado escrito en un lenguaje de alto nivel?

Algunos ejemplos simples pero útiles:

  • Establezca la intersección, la unión y la diferencia de los archivos de texto a través de ordenar / uniq: suponga que a y b son archivos de texto que ya están exclusivos. Tenga en cuenta que esto es rápido y funciona en archivos de tamaño arbitrario, hasta muchos gigabytes. (La clasificación no está limitada por la memoria, aunque es posible que tenga que usar -T.) Para comparar, vea cuántas líneas es para escribir una clasificación de combinación basada en disco en Java.

gato ab | ordenar uniq> c # c es una unión b

gato ab | ordenar uniq -d> c # c es una intersección b

gato abb | ordenar uniq -u> c # c es la diferencia establecida a – b

  • Sumando todos los números en la tercera columna de un archivo de texto (esto es probablemente 3 veces más rápido y 3 veces menos código que el equivalente de Python):

awk ‘{x + = $ 3} FIN {imprimir x}’ miarchivo

  • Si desea ver tamaños / fechas en un árbol de archivos, esto es como un “ls -l” recursivo, pero es más fácil de leer que “ls -lR”:

encontrar . -tipo f -ls

  • Utilice xargs. Es muy poderoso. Tenga en cuenta que puede controlar cuántos elementos se ejecutan por línea (-L) así como el paralelismo (-P). Si no estás seguro de si va a hacer lo correcto, usa primero xargs echo. Además, -I {} es útil. Ejemplos:

encontrar . -nombre \ *. py | xargs grep some_function

anfitriones de gatos | xargs -I {} ssh root @ {} nombre de host

  • Supongamos que tiene un archivo de texto, como un registro de servidor web, y un cierto valor que aparece en algunas líneas, como un parámetro acct_id que está presente en la URL. Si desea un recuento de cuántas solicitudes para cada acct_id:

cat access.log | egrep -o ‘acct_id = [0-9] +’ | corte -d = -f2 | ordenar uniq -c | ordenar -rn

(En parte, ¿Cuáles son algunos consejos para ahorrar tiempo que todos los usuarios de Linux deberían saber? Que contienen algunos otros. Además, vea mi nota sobre el uso de la configuración regional de C, que puede afectar significativamente el rendimiento).

[Una versión ampliada de esta respuesta ahora está en Github.]

Mi respuesta es tan insólita que he debatido sobre su publicación. Pero es bastante útil para las personas que simplemente se introducen en shell scripting. Así que aquí va: dos simples bash one-liners que uso a diario:

para i en $ ( hacer algo ); hacer alguna orden $ i; hecho

hacer algo ” normalmente sería otro comando que produce un resultado que
sería alimentado en el bucle somecommand $ i.

Por ejemplo, el siguiente comando analizará una lista de direcciones IP y realizará búsquedas DNS posteriores en cada una:

para i en $ (cat ./list_of_ip_addresses.txt); cavar $ i; hecho

mientras que verdad hacer algo dormir X; hecho

Haz algo “, espera X segundos, luego hazlo de nuevo infinitamente hasta que controles-c
fuera de el.

Por ejemplo, lo siguiente creará una prueba de latencia promedio desde su máquina a un sitio web determinado y almacenará los resultados en un archivo de registro:

mientras que verdad hacer \
echo `fecha +% m-% d-% Y:% H:% M:% S`” “\
`curl -o / dev / null -s -w \
% {time_connect}:% {time_starttransfer}:% {time_total} \
http://www.example.com `>> curl_log.txt; hecho

Suponiendo que ya hiciste esto en tu máquina local una vez (solo presiona intro para aceptar todos los valores predeterminados:

ssh-keygen -t rsa

Esto le permitirá acceder a una máquina remota sin tener que escribir una contraseña más:

ssh @ mkdir -p .ssh && cat .ssh/id_rsa.pub | ssh @ 'cat >> .ssh/authorized_keys'

Tendrás que ingresar tu contraseña dos veces más. ¿Pero a quién estamos engañando? Solo póngalo en un script para que no tenga que escribir todo eso. También le permitiría escribir solo el nombre de usuario / host remoto una vez.

EDITAR:
¡Según el comentario de Baptiste, ssh-copy-id es aún mejor!

Parece estar fácilmente disponible en Ubuntu, pero no está en OSX de forma predeterminada, pero si tiene Homebrew, puede instalarlo tan simple como escribir:

brew install ssh-copy-id

Aún necesitarías hacer el ssh-keygen, pero luego, en lugar de esa línea fea con comandos cat, puedes hacer esto:

ssh-copy-id -i ~/.ssh/id_rsa.pub @

Entonces solo debes ingresar tu contraseña una vez!