estoy tratando de extraer una subcadena con awk de un comando de respuesta en bash

ejemplo de salida de línea: abc_def_ghi jkl_lmn_opq

llegar la segunda parte es fácil por

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'

pero solo me falta la última parte de la subcadena «opq» y no encontrar una manera de dejar awk ejecutar dos veces más de la cadena, cuando me pase el resultado de un var y el uso de esta variable para el segundo awk me sale un error, porque la cadena es una ruta de acceso y, por tanto, un Directorio. también no tuve sed para trabajar con el mismo error cuando se utiliza en un almacenados var con la cadena y no pude pasar la primera subcadena a segunda awk o sed. raro?

esto sería hacer el Trabajo si no es la primera awk iba a imprimir, en lugar de pasar a la segunda awk

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}' | awk -F"_" '{print $3}'

funciona ni

echo abc_def_ghi jkl_lmn_opq | awk '{$2}' | awk -F"_" '{print $3}'

¿cómo puedo pasar de derecha a segundo tira?

InformationsquelleAutor peet | 2013-06-05

4 Comentarios

  1. 4

    Esto debería funcionar:

    $ echo abc_def_ghi jkl_lmn_opq | awk -F_ '{ print $NF}'
    opq

    NF es un variable que almacena el número de campos. Cuando se divide la línea con _ y decirle awk para imprimir $NF va a imprimir el último campo.

    Sin embargo, no siempre se necesita la última parte de la cadena. En ese caso, usted puede utilizar substr función en awk.

    Usando el mismo ejemplo, usted puede hacer:

    $ echo abc_def_ghi jkl_lmn_opq | awk ' { print substr($2,9) }'
    opq

    substr función recibe 3 argumentos, el tercero opcional. El primer argumento es la cadena en cuestión. El segundo argumento es el punto de partida y el tercero (opcional) argumento es la longitud que se desee capturar. Si no se indica, a continuación, por defecto se captura todo hasta el final de la cadena.

    • gracias, estaba pensando demasiado complicado, supongo 🙂
    • gracias de nuevo por cavando más profundo y proporcionar comprimido guía de uso, me gusta el substr versión, mientras que en este caso especial que no siempre estoy de shure de el (porque la cadena devuelta desde otra función) la longitud de la cadena, mientras que yo soy shure será siempre la última parte
    • Que son muy bienvenidos.
    • para otros, ahora necesitan de la segunda (o de otros) y por último subcadena en esta solución sería: echo abc_def_ghi jkl_lmn_opq | awk -F_ '{print $(NF-1)}' aunque no sé ahora cómo Contar desde el principio de la cadena?
    • Usted puede utilizar siempre for loop y hacer for (i=1;i<NF;i++) { printf $i FS } print NF
  2. 1

    También se puede hacer de la sustitución de parámetros en bash:

    var="abc_def_ghi jkl_lmn_opq";
    echo ${var##*_};

    devuelve

    opq
    • Bonito y sencillo! En este caso el uso de echo ... | awk ... es una exageración.
    • de echo fue sólo para la prueba de salida, si el var es ya esto es muy simple la solución, en mi caso exacto de la entrada de awk es el regreso de otra función y el uso de un var sólo fue mi solución, ya que no te pasó primero despojado de cadena para el segundo awk – pero existente var una manera fresca de sí. (mientras voy a tener que [y hará] leer acerca de esta solución a entender 🙂
  3. 0

    Esto podría funcionar para usted (GNU sed):

    sed 's/.*_//' <<<"abc_def_ghi jkl_lmn_opq"
    • trabajando mientras no me llegue la derecha. s es la separación del interruptor, el segundo es el separador, pero ¿por qué regresar última subcadena sin un tercer argumento – comportamiento por defecto?
    • significa encontrar cero o más de un solo carácter. Como la regexp motor es codiciosos es cremalleras para el final de la cadena. Luego se tiene que dar marcha atrás hasta que encuentra un _. Por lo que este busca la última _ en la cadena y, a continuación, elimina todos los caracteres y el último _ dejando el resultado deseado. Recuerde que la cadena es de todo, desde abc a opq.
    • gracias por la explicación, lo que voy a utilizar para obtener el último segundo de la subcadena?

Dejar respuesta

Please enter your comment!
Please enter your name here