Primeiro de tudo, o que você está tentando fazer, l| grep <filename> é ruim. Não faça isso. Aqui está o porquê.
l é realmente um alias para ls -CF
$ type -a l
l is aliased to 'ls -CF'
Por padrão, no bash do Ubuntu, ls é um alias para ls --color=auto . Como o Steeldriver apontou nos comentários, --color=auto deveria desativar a colorização. No seu caso específico, você tem alias ls="ls -alh --color" e alias l="ls -CF" , que basicamente acaba sendo ls -alh --color -CF . Essa combinação específica de switches ainda envia saída colorida em um pipe. Por exemplo:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Observe como os diretórios . e .. têm as mesmas sequências de escape.
O que isso tudo significa
Isso significa que l produzirá uma lista colorida de arquivos de acordo com o tipo de arquivo. O problema é que a colorização acontece com o uso de seqüências de escape . Isso é o que são 1:34m coisas - eles são seqüência de escape para cores específicas.
O principal problema é que a análise de ls geralmente leva a resultados e desastres errados em scripts, simplesmente porque ls permite sequências de escape, como explicado anteriormente, e outros caracteres especiais. Veja este artigo para mais informações: link
O que você deveria fazer:
Use o comando find :
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Você poderia fazer algo assim com o shell glob e o teste moderno [[ command:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Ou talvez use o python, que tem recursos de manuseio de arquivos muito melhores do que bash sozinho
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Se não houver necessidade de processar a saída de ls , a simples globbing com ls também poderá funcionar. (Lembre-se, isso é apenas para visualizar a lista de arquivos, não para passá-lo para outro programa para lidar com o texto de saída)
bash-4.3$ ls *1*
1.txt