Entonces, abrir un archivo con cat
y luego usarlo grep
para obtener líneas coincidentes solo me lleva muy lejos cuando estoy trabajando con el conjunto de registros particular con el que estoy tratando. Necesita una forma de hacer coincidir las líneas con un patrón, pero solo para devolver la parte de la línea después de la coincidencia. La porción antes y después del partido variará constantemente. He jugado con sed
o awk
, pero no he podido descubrir cómo filtrar la línea para eliminar la parte antes del partido, o simplemente devolver la parte después del partido, funcionará. Este es un ejemplo de una línea que necesito filtrar:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
La porción que necesito es todo después de "estancado".
El trasfondo detrás de esto es que puedo descubrir con qué frecuencia algo se detiene:
cat messages | grep stalled | wc -l
Lo que necesito hacer es averiguar cuántas veces se ha estancado un determinado nodo (indicado por la parte antes de cada dos puntos después de "estancado"). no hay paradas, lo que no me ayuda. Necesito filtrar solo la parte detenida para poder buscar un nodo específico de los que se han estancado.
Para todos los efectos, este es un sistema freebsd con utilidades centrales GNU estándar, pero no puedo instalar nada extra para ayudar.
fuente
sed
solución y no trate los espacios en blanco especialmente.Respuestas:
La herramienta canónica para eso sería
sed
.Explicación detallada:
-n
significa no imprimir nada por defecto.-e
es seguido por un comando sed.s
es el comando de reemplazo de patrón.^.*stalled:
coincide con el patrón que está buscando, más cualquier texto anterior (es.*
decir, cualquier texto, con una inicial^
que indique que la coincidencia comienza al comienzo de la línea). Tenga en cuenta que sistalled:
ocurre varias veces en la línea, esto coincidirá con la última ocurrencia.stalled:
, se reemplaza por la cadena vacía (es decir, se elimina).p
medio para imprimir la línea transformada.Si desea retener la parte correspondiente, use una referencia inversa:
\1
en la parte de reemplazo se designa lo que está dentro de un grupo\(…\)
en el patrón. Aquí, podríastalled:
volver a escribir en la parte de reemplazo; Esta característica es útil cuando el patrón que está buscando es más general que una cadena simple.A veces querrás eliminar la parte de la línea después del partido. Puede incluirlo en la coincidencia al incluirlo
.*$
al final del patrón (cualquier texto.*
seguido del final de la línea$
). A menos que coloque esa parte en un grupo al que hace referencia en el texto de reemplazo, el final de la línea no estará en la salida.Como ilustración adicional de grupos y referencias, este comando intercambia la parte anterior al partido y la parte posterior al partido.
fuente
sed … <messages
, ya que desea procesar datos de un archivo. Para actuar sobre los datos producidos por otro comando, tendrá que utilizar un tubo:somecommand | sed …
.sed 's/^.*stalled//'
ya que-r
es específico de Linux y no funciona en otros sistemas como macOS y aquí no obtienes ningún beneficio.La otra herramienta canónica que ya usa
grep
:Por ejemplo:
Tiene el mismo resultado que la segunda opción de Gilles:
La
-o
bandera devuelve la--only-matching
parte de la expresión, por lo que no toda la línea que, por supuesto, normalmente se hace con grep.Para eliminar el "estancado:" de la salida, podemos usar una tercera herramienta canónica, cortar:
El
cut
comando usa delimitador:
e imprime el campo 2 hasta el final. Es una cuestión de preferencia, por supuesto, pero lacut
sintaxis me parece muy fácil de recordar.fuente
-o
opción! Quería señalar quegrep
no reconoce el\n
como una nueva línea, por lo que su primer ejemplo solo coincide con el primern
personaje. Por ejemplo,echo "Hello Anne" | grep -o 'A[^\n]*'
devuelve la cadenaA
. Sin embargo,echo "Hello Anne" | grep -o 'A.*'
devuelve el esperadoAnne
, ya que.
coincide con cualquier carácter excepto la nueva línea.cut
delimitador-d':'
. Me resulta más fácil recordarlo con comillas, por ejemplo, con-d' '
o-d';'
.-f 2
. En serio, ¿por qué no?;
lugar de dos puntos:
se interpretará de manera diferente si no se cita. Por supuesto que es un comportamiento lógico, pero aún así me gusta confiar en la memoria muscular. No me gusta citar el delimitador una vez, pero no la otra. Solo preferencia personal, como dije antes: más fácil de recordar..*
necesario, funcionó bien para mí:cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*'
regresaxyz text
Solía
ifconfig | grep eth0 | cut -f3- -d:
tomar estoy hacer que se vea así
fuente
cat /sys/class/net/*/address
, no requiere análisis.Otra herramienta canónica que consideró
awk
podría usarse con la siguiente línea:Explicación detallada:
-F
define un separador para la línea, es decir, "estancado". Todo antes del separador se trata con$1
y todo después con$2
./reg-ex/
Busca la expresión regular coincidente, en este caso "estancada".{print $<n>}
- imprime n columna. Dado que su separador se define como bloqueado, todo lo que se encuentre después de bloqueado se considera la segunda columna.fuente