scripts script resueltos programas programacion pasar parametros manejo español ejercicios ejemplos comandos cadenas bash wc

script - bash echo número de líneas de archivo dadas en una variable bash sin el nombre del archivo



scripts linux ejercicios resueltos (6)

Tengo los siguientes tres constructos en un script bash:

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE) echo $NUMOFLINES" lines" echo $(wc -l $JAVA_TAGS_FILE)" lines" echo "$(wc -l $JAVA_TAGS_FILE) lines"

Y ambos producen resultados idénticos cuando se ejecuta el script:

121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines

Es decir, el nombre del archivo también se repite (lo que no quiero). ¿Por qué estos scriplets fallan y cómo debería generar un resultado limpio?

121711 lines

?


Un ejemplo usando tus propios datos

Puede evitar tener su nombre de archivo incrustado en la variable NUMOFLINES utilizando la redirección de JAVA_TAGS_FILE , en lugar de pasar el nombre de archivo como argumento a wc . Por ejemplo:

NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")

Explicación: Use Pipes o Redirection para evitar nombres de archivo en Output

La utilidad wc no imprimirá el nombre del archivo en su salida si la entrada se toma de un operador de canalización o redirección. Considera estos varios ejemplos:

# wc shows filename when the file is an argument $ wc -l /etc/passwd 41 /etc/passwd # filename is ignored when piped in on standard input $ cat /etc/passwd | wc -l 41 # unusual redirection, but wc still ignores the filename $ < /etc/passwd wc -l 41 # typical redirection, taking standard input from a file $ wc -l < /etc/passwd 41

Como puede ver, la única vez que imprimiremos el nombre del archivo es cuando se pasa como un argumento, en lugar de como datos en la entrada estándar. En algunos casos, es posible que desee que se imprima el nombre del archivo, por lo que es útil comprender cuándo se mostrará.


(aplicar en Mac, y probablemente otros Unixes)

En realidad, hay un problema con el enfoque de wc: no cuenta la última línea si no termina con el símbolo de fin de línea.

Use esto en su lugar

nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)

o incluso mejor (gracias gniourf_gniourf):

nblines=$(grep -c '''' file.txt)

Nota: El enfoque awk de chilicuil también funciona.


Es muy simple:

NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )

o

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk ''{print $1}'')


Normalmente uso la función ''back tick'' de bash

export NUM_LINES=`wc -l filename`

Tenga en cuenta que la "marca" es la "marca de retroceso", por ejemplo, "no la comilla simple normal"


También puedes usar awk:

awk ''END {print NR,"lines"}'' filename

O

awk ''END {print NR}'' filename


wc no puede obtener el nombre de archivo si no le das uno.

wc -l < "$JAVA_TAGS_FILE"