Почему команда «l | grep ”1“ ”получить неправильный результат?

Как показано на рисунке, я использую l, чтобы получить файл в текущей папке. И затем я хочу получить файл с номером 1, поэтому я использую pipe и grep.

Но почему появляются файлы 2 и 22? А что такое 1;34m?

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

Обновление

У меня уже есть псевдоним команды l в моем файле zshrc.

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

А вот и результат команды type:

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF
13
задан 28 December 2016 в 19:49

3 ответа

В первую очередь, что Вы пытаетесь сделать, l| grep <filename> плохо. Не делайте этого. Вот то, почему.

l команда является действительно псевдонимом к ls -CF

$ type -a l
l is aliased to `ls -CF'

По умолчанию в Ubuntu bash , ls псевдоним к ls --color=auto. Как steeldriver указанный в комментариях --color=auto как предполагается, выключает колоризацию. В Вашем конкретном случае Вы имеете alias ls="ls -alh --color" и alias l="ls -CF" , который в основном заканчивает тем, что был ls -alh --color -CF. Эта конкретная комбинация переключателей все еще отправляет цветной вывод по каналу. Например:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

Заметьте как . и .. каталоги имеют те же escape-последовательности.

Что это все означает

Это означает это l произведет цветной список файлов согласно типу файла. Проблема состоит в том, что колоризация происходит с использованием escape-последовательностей. Это что 1:34m вещи - они - escape-последовательность для определенных цветов.

Основной проблемой является тот парсинг ls часто приводит к неправильному выводу и авариям в сценариях, просто потому что ls позволяет escape-последовательности, любят объясненный ранее и другие специальные символы. См. эту статью для большего количества информации: http://mywiki.wooledge.org/ParsingLs

Что необходимо делать:

Использовать find команда:

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

Вы могли сделать что-то вроде этого с шариком оболочки и современным тестом [[ команда:

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

Или, возможно, используйте Python, который имеет намного лучшие возможности обработки имени файла, чем bash один

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

Если нет никакой потребности обработать вывод ls , простой globbing с ls может сделать работу, также. (Помните, это только для просмотра списка файлов, не для передачи его к другой программе для контакта с синтезируемым текстом),

bash-4.3$ ls *1*
1.txt
27
ответ дан 28 December 2016 в 19:49
  • 1
    Да, пакет был просто обновлен с поддержкой Qt 5.5, позволив ему скомпилировать в Ubuntu 16.04. Это doesn´ t работают в Единице все же. – Logix 4 December 2018 в 21:59

Ваш l и ls команды являются установкой как псевдонимами.

Когда Вы выполняете их передающий вывод по каналу через grep "1" (использование |) каждая строка экрана, где 1 появляется отображен, с 1 окрашенный красный.

Поскольку имена файлов ., .., 2 и 22 появитесь на той же строке экрана, они производятся grep также, но не появляйтесь в красном, который показывает grep соответствия.

:34m escape-последовательность для цвета, который не красит правильно. На основе Вашего пересмотренного вопроса с выводом type -a l и type -a это может быть воспроизведено в моей системе. Обратите внимание, что необходимо изменить псевдоним от --color кому: --color=auto:

Вывод цвета

color ls

6
ответ дан 28 December 2016 в 19:49
  • 1
    sudo только имеет эффект на эти echo команда, не перенаправление вывода. Попробуйте echo 'deb http://security.ubuntu.com/ubuntu bionic-security main' | sudo tee -a /etc/apt/sources.list вместо этого. – Stefan Hamcke 17 October 2018 в 22:03

В Вашей пробной версии Вы называли Ваш ls псевдоним, таким образом 1;34m и подобный шум, которые прибывают из окраски, и так как канал | получает все это на той же строке, grep соответствия файл 1 от той строки и следовательно печатает эту строку. Это - то, что Вы видите на экране.

при выполнении материала как этот всегда хорошо вернуться к системной команде с 1 результатом на строку.

, Чтобы избавиться от псевдонимов просто тип \ls и использовать опцию -1 распечатать результаты, разделенные с методической точностью, питается.

$ \ls -1 | grep "1"
1
11

Примечание: метод обратной косой черты работает с каждой командой, \command просто вызовы неискаженная системная команда.

0
ответ дан 28 December 2016 в 19:49
  • 1
    Спасибо @choroba, делает это означает что я can' t заменяют переменные оболочки / переменные среды от других внешних команд как подпроцесс Python. – lazarus 17 October 2018 в 21:13

Другие вопросы по тегам:

Похожие вопросы: