Вот еще один способ сделать это с помощью awk
:
#!/usr/bin/env bash
for dir in "$@"; do
for file in "$dir"/*; do
awk 'END{if(NR>=15 && NR<=50){print FILENAME}}' "$file";
done
done
ОБЪЯСНЕНИЕ: awk
(и его многочисленные варианты, такие как gawk
mawk
т.д.) Читают файл построчно. Переменная NR
является текущим номером строки. Блок END{}
будет выполнен, когда будет достигнута последняя строка входного файла, и в этот момент NR
будет числом lnes в файле. Наконец, FILENAME
- это имя файла, который обрабатывается в данный момент. Таким образом, скрипт печатает имя файла, если количество увиденных строк составляет от 15 до 50.
Точно так же вы можете сделать это с Perl:
#!/usr/bin/env bash
for dir in "$@"; do
for file in "$dir"/*; do
perl -ne 'END{if($. >=15 && $. <=50){print "$ARGV\n"}}' "$file"
done
done
ОБЪЯСНЕНИЕ: perl -ne
также будет читать файл построчно. В Perl номер текущей строки хранится в $.
и блок END
работает так же, как в awk
. $ARGV
- это аргумент, передаваемый в командной строке, имя файла, которое будет напечатано, только если оно содержит правильное количество строк.
Ваш лучший выбор, вероятно, будет bash и wc
ответом @grawity, но реализация wc
не повлияет на них и должна хорошо работать на любом * nix.