ag (серебряный поисковик)обеспечивает очень быстрый поиск в файлах, а также имеет возможность поиска по имени файла:
>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg
real 0m0.884s
user 0m0.701s
sys 0m0.178s
>: time find. -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg
real 0m29.744s
user 0m2.108s
sys 0m13.982s
>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg
real 0m16.698s
user 0m1.951s
sys 0m7.119s
Таким образом, в моем случае это > 30 раз быстрее, если файл не игнорируется ag.
Сgrep
:
< file.in grep -E '^[#!]|.{4}' > file.out
То есть выберите строки, которые либо начинаются с #
или !
, либо содержат последовательность из 4 символов.
Или сawk
:
< file.in awk '/^[#!]/ || length >= 4' > file.out
Или сsed
:
< file.in sed -e '/^[#!]/b' -e '/.\{4\}/!d' > file.out
Вы можете попробовать что-то подобное, код не тестировался:
while read line;
do
var=$(echo $line | awk '{ print length }')
if [ $var -le 4 ]; then
echo $line >> tmp.file
fi
done < your.file
Это 2 шага, при чтении он записывает строки длиной менее 4 символов в tmp.file. С помощью comm -23 your.file tmp.file
вы сравниваете оба файла, подавляете общие строки, а > you.new.file
является окончательной сохраненной версией