Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I often use dpkg or aptitude combined with grep when I want to list certain packages available or installed on my system, but I noticed that when I add | grep, the output lines look a little bit different.

Here's a pure dpkg output, the first command was typed when the terminal was smaller, the second one when the terminal was maximized:

screen

As you can see, the output differs depending on the size of the window -- the spaces are reduced in the case of a smaller one.

Now, what happens when we add | grep:

screen

A part of the first output was dropped to the second line. But when I maximised the terminal and typed the command once more, the line is in one piece. Moreover, the columns have the same fixed size (the same spaces between them).

This is an aptitude output:

screen

Both commands were typed in the maximised window, but the grep line has narrower columns, and some text of the third column was cut off.

Why does it happen? Is there a way to stop grep from resizing the lines?

I don't know how to add an image without changing its parameters, I hope you see what I'm talking about.

share|improve this question

1 Answer 1

up vote 6 down vote accepted

It is not grep changing the output. It is dpkg and aptitude. They check whether the output goes to a terminal or to some other command.

If it is a terminal they adapt their own output width to match the terminal size.

If the output does not go to a terminal, the command has no idea what column size would be appropriate. (The output might as well end in some file.)

The same happens with ls. Compare ls and ls|cat.


There is no general way to solve this, but some commands might have specific options for that. For example aptitude has --disable-columns and -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).

The man page of dpkg says:

   COLUMNS
          Sets the number of columns dpkg should use when
          displaying formatted text. Currently only used by -l.
share|improve this answer
    
Is there a way to set a certain width parameter when using | and other commands? –  Mikhail Morfikov Jan 11 at 10:54
3  
The pipe | is something inside your shell, changing the output from the terminal to a new descriptor which is set up as input for the second command. The first command itself can only check, whether its output is a terminal or not. Some commands might support command line options to explicitly set a width, or they might check the $COLUMNS environment variable. But this is totaly up to the command itself. –  michas Jan 11 at 11:00
    
Yep, if I set in aptitude the -w option, it works, but it gives me 2 extra empty lines between each normal line. Is there something I can do about it? In case of dpkg it is possible to use the COLUMNS variable -- COLUMNS=100 dpkg -l test | grep test, but this woks only in the case of dpkg, aptitude ignores it. –  Mikhail Morfikov Jan 11 at 13:55
    
Yes, this kind of formatting is highly command specific. Each command is able to provide its own way. The extra lines might come from a too large width value. aptitude -k $COLUMNS should be fine. –  michas Jan 11 at 14:43
1  
That was a typo of me. I meant aptitude -w $COLUMNS. –  michas Jan 11 at 17:03

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.