Soy nuevo en esto ... Necesito un script que reciba un directorio como parámetro e imprima los nombres de los archivos que tienen entre 15 y 50 líneas, pero no sé cómo usar la wcsalida en una ifsecuencia:
#!/bin/bash
for f in `ls`; do
echo "File -> $f"
cat $f | wc -l
done
¿Cómo recibo un parámetro? ¿Y cómo asigno una wcsalida a una variable?

for f in `ls`, por favor. Simplemente usefor f in *. Ver: mywiki.wooledge.org/ParsingLsRespuestas:
Los parámetros pueden ser recibidos como
$1,$2, etc., o$*para todos ellos.También está la matriz
$@, que generalmente se usa"$@"como una mejor versión de$*. Otro uso posible es el${@:3}que significa "todos los argumentos que comienzan con 3rd".Para obtener la salida de un comando, use
$( ... )o su forma anterior` ... `. En general, se recomienda usar siempre,$()ya que puede estar anidado, por ejemploblah=$(cat /blah/$(blah)/blah).Recursos utiles:
fuente
wc(al menos el que tengo en OS X) rellena el recuento de líneas con espacios iniciales incluso cuando lo hacewc -l < "$file", lo que necesita un trabajo de análisis adicional.for dir dolugar defor dir in "$@"; dodeclare -i.File -> ./foo ( 47 lines)o similar, pero eso es un problema menor.declare -iolet.Aquí hay otra forma de hacerlo usando
awk:EXPLICACIÓN:
awk(y sus muchas variantes comogawkomawketc.) leen un archivo línea por línea. La variableNRes el número de línea actual. SeEND{}ejecutará un bloque cuando se llegue a la última línea del archivo de entrada, en cuyo puntoNRserá el número de líneas en el archivo. Finalmente,FILENAMEes el nombre del archivo que se está procesando actualmente. Entonces, el script imprime el nombre del archivo si el número de líneas que ha visto está entre 15 y 50.Del mismo modo, puedes hacer esto con Perl:
EXPLICACIÓN:
perl -netambién leerá un archivo línea por línea. En Perl, el número de línea actual se almacena$.y elENDbloque funciona de la misma manera que enawk.$ARGVes el argumento pasado en la línea de comando, el nombre del archivo que se imprimirá solo si tiene el número correcto de líneas.Probablemente, su mejor opción sea bash y
wcrespuesta de @grawity, pero lawcimplementación no afectará a estos y debería funcionar bien en cualquier * nix.fuente
$.es el número de línea, ¿cuál es$,? (El nuevo operador "smartmatch" debería funcionar como$. ~~ 15..50, aunque necesito probarlo)~~puede funcionar, pero no estoy muy familiarizado con él y es mucho más esotérico. Pensé que daría una respuesta más simple.Generar algunos archivos:
Imprima solo aquellos que cumplan los criterios:
fuente