Почему grep меняет длину выходных строк?

4

Я часто использую dpkgили aptitudeкомбинирую с, grepкогда хочу перечислить определенные пакеты, доступные или установленные в моей системе, но я заметил, что при добавлении | grepстроки вывода выглядят немного по-другому.

Вот чистый dpkgвывод, первая команда была введена , когда терминал был меньше, вторая, когда терминал был развернут:

экран

Как видите, вывод отличается в зависимости от размера окна - пробелы уменьшаются в случае меньшего.

Теперь, что происходит, когда мы добавляем | grep:

экран

Часть первого вывода была перенесена на вторую строку. Но когда я развернул терминал и набрал команду еще раз, строка оказалась цельной. Кроме того, столбцы имеют одинаковый фиксированный размер (одинаковые промежутки между ними).

Это aptitudeвывод:

экран

Обе команды были введены в развернутом окне, но в grepстроке есть более узкие столбцы, и часть текста третьего столбца была обрезана.

Почему это происходит? Есть ли способ остановить grepизменение размеров линий?

Я не знаю, как добавить изображение без изменения его параметров, надеюсь, вы понимаете, о чем я говорю.

Михаил Морфиков
источник

Ответы:

7

Это не grepменяет вывод. Это dpkgи есть aptitude. Они проверяют, идет ли вывод на терминал или какую-то другую команду.

Если это терминал, они адаптируют собственную ширину вывода в соответствии с размером терминала.

Если выходные данные не отправляются на терминал, команда не знает, какой размер столбца будет подходящим. (Вывод может также закончиться в каком-то файле.)

То же самое происходит с ls. Сравните lsи ls|cat.


Не существует общего способа решить эту проблему, но некоторые команды могут иметь определенные опции для этого. Например aptitudeимеет --disable-columnsи -w:

   --disable-columns
       This option causes aptitude search and aptitude versions to output
       their results without any special formatting. In particular:
       normally aptitude will add whitespace or truncate search results in
       an attempt to fit its results into vertical “columns”.
       With this flag, each line will be formed by replacing any format
       escapes in the format string with the corresponding text; column
       widths will be ignored.

   -w <width>, --width <width>
       Specify the display width which should be used for output from
       the search command (by default, the terminal width is used).

Страница руководства dpkgговорит:

   COLUMNS
          Sets the number of columns dpkg should use when
          displaying formatted text. Currently only used by -l.
Михась
источник
1
Есть ли способ установить определенный параметр ширины при использовании |и других команд?
Михаил Морфиков
3
Канал |- это что-то внутри вашей оболочки, изменяющее вывод из терминала на новый дескриптор, который устанавливается как ввод для второй команды. Первая команда сама может только проверить, является ли ее вывод терминалом или нет. Некоторые команды могут поддерживать параметры командной строки для явного задания ширины или могут проверять переменную среды $ COLUMNS. Но это полностью зависит от самой команды.
Михас
Да, если я изложу в aptitudeпо -wвыбору, она работает, но это дает мне 2 дополнительных пустые строки между каждой нормальной линией. Что я могу с этим поделать? В случае dpkgэтого можно использовать COLUMNSпеременную - COLUMNS=100 dpkg -l test | grep test, но это работает только в случае dpkg, aptitudeигнорирует ее.
Михаил Морфиков
Да, этот тип форматирования сильно зависит от команды. Каждая команда может предоставить свой собственный путь. Дополнительные строки могут быть получены из-за слишком большого значения ширины. aptitude -k $COLUMNSвсе должно быть в порядке.
Михас
1
Это была опечатка с моей стороны. Я имел в виду aptitude -w $COLUMNS.
Михас