Me gustaría obtener el número rating
como resultado de esto
# nc localhost 9571
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94
Puedo hacerlo asi
# nc localhost 9571 | grep rating | cut -d: -f2
94
pero podría awk
usarse en su lugar para una solución más simple?
Respuestas:
fuente
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?Quanta me ganó, pero incluiré una
sed
variante si estás inclinado de esa manera:Sin embargo, lo mismo dice MadHatter. Su solución actual es perfectamente sólida. (Aunque preferiría en
"^rating:"
lugar de solo la palabra para asegurarme de que solo obtenga la línea que desea).fuente
sed
! Está tan subutilizado y subestimado ...También puedes usar el shell:
fuente
nc
. ¡Agradable!Sí, puede (y debe) usar (uno) awk en lugar de (dos) grep y cortar:
Asegúrese de hacer coincidir su línea lo mejor que pueda para evitar errores feos.
/rating/
trabajos,/^rating/
es mejor (más seguro)/^rating:/
es lo mejor (en este caso).fuente
Puede:
(No sé lo que está haciendo con localhost arriba, así que usé su salida como entrada para mi comando awk, luego reemplacé el "gato" con "nc ...", pero debería estar bien).
¿Pero por qué harías esto? La forma UNIX es tener muchas herramientas pequeñas, cada una de las cuales hace bien una cosa, unidas a través de tuberías, en lugar de usar herramientas multifunción más grandes. Debe seleccionar una sola línea coincidente, seleccione un campo a partir de allí:
grep
selecciona líneas con coincidencias ycut
selecciona campos de las líneas de entrada; Son perfectos para la tarea. Pero si realmente quieres hacerlo todo junto con awk, bueno, ahí lo tienes.fuente
grep
ycut
requiere generar dos procesos, y usarawk
(osed
) requiere solo uno. Generar un proceso es computacionalmente costoso. Además, a diferencia de usarperl
oruby
(et al),sed
yawk
son mucho más ligeros por adelantado.Si bien la respuesta de quanta es la más fácil y la que yo también escribiría, apuesto a que no sabías que GNU awk (gawk) también puede hacer redes . Puedes escribir todo con awk si realmente quieres:
Esto puede ser útil si un servidor no tiene nc instalado, nc tiene permisos restringidos o si realmente le gusta awk.
fuente
También puedes usar sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Esto asegurará que la "calificación" comience la línea, y que los dígitos sigan el
rating:
fuente
Si Perl es una opción:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
las divisiones automáticas de cada línea en la@F
matriz se-F:
utilizan:
como separador de campo, en lugar del valor predeterminado de espacios en blanco/rating/
devuelve verdadero si se encuentra que la expresión regular$F[1]
es el segundo elemento de la@F
matriz.Las matrices de Perl comienzan con el elemento 0, mientras que awk comienza con $ 1
fuente