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 wc
salida en una if
secuencia:
#!/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 wc
salida 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 do
lugar defor dir in "$@"; do
declare -i
.File -> ./foo ( 47 lines)
o similar, pero eso es un problema menor.declare -i
olet
.Aquí hay otra forma de hacerlo usando
awk
:EXPLICACIÓN:
awk
(y sus muchas variantes comogawk
omawk
etc.) leen un archivo línea por línea. La variableNR
es 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 puntoNR
será el número de líneas en el archivo. Finalmente,FILENAME
es 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 -ne
también leerá un archivo línea por línea. En Perl, el número de línea actual se almacena$.
y elEND
bloque funciona de la misma manera que enawk
.$ARGV
es 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
wc
respuesta de @grawity, pero lawc
implementació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