Search code examples
linuxbashunixawkls

Formatting ls output without tab using awk?


My question may seem fairly simple, I'm a beginner at bash scripting still, but I'm trying to format my ls output without using a tab when I print with awk.

Here is my current command that I'm running:

ls -al | sed 1d | awk '{print $1" ",$6" ", $7"\t", $9}'

and it prints out the following

drwx------  Feb  13     .
drwxr-xr-x  Feb  5      ..
-rw-r--r--  Jan  21     .alias
-rw-r--r--  Feb  13     .bash_history
-rw-r--r--  Jan  29     .bash_profile
-rw-r--r--  Jan  21     .bash_profile~
-rw-r--r--  Feb  13     .bashrc
-rw-r--r--  Jan  21     .bashrc~
drwxr-xr-x  Jan  3      csc135
drwxr-xr-x  Aug  13     csc136
drwxr-xr-x  Feb  9      csc235
drwxr-xr-x  Oct  19     csc237
drwxr-xr-x  Feb  18     csc310
drwxr-xr-x  Feb  6      csc325

I have also attempted using a space:

ls -al | sed 1d | awk '{print $1"  ",$6" ", $7" ", $9}'

which prints the following (quite bothersome):

drwx------   Feb  13  .
drwxr-xr-x   Feb  5  ..
-rw-r--r--   Jan  21  .alias
-rw-r--r--   Feb  13  .bash_history
-rw-r--r--   Jan  29  .bash_profile
-rw-r--r--   Jan  21  .bash_profile~
-rw-r--r--   Feb  13  .bashrc
-rw-r--r--   Jan  21  .bashrc~
drwxr-xr-x   Jan  3  csc135
drwxr-xr-x   Aug  13  csc136
drwxr-xr-x   Feb  9  csc235
drwxr-xr-x   Oct  19  csc237
drwxr-xr-x   Feb  18  csc310
drwxr-xr-x   Feb  6  csc325

Is there any way to make it nicer looking like this?

drwx------  Feb  13  .
drwxr-xr-x  Feb  5   ..
-rw-r--r--  Jan  21  .alias
-rw-r--r--  Feb  13  .bash_history
-rw-r--r--  Jan  29  .bash_profile
-rw-r--r--  Jan  21  .bash_profile~
-rw-r--r--  Feb  13  .bashrc
-rw-r--r--  Jan  21  .bashrc~
drwxr-xr-x  Jan  3   csc135
drwxr-xr-x  Aug  13  csc136
drwxr-xr-x  Feb  9   csc235
drwxr-xr-x  Oct  19  csc237
drwxr-xr-x  Feb  18  csc310
drwxr-xr-x  Feb  6   csc325

Solution

  • One automatic option that comes to mind is column:

    $ ls -al | sed 1d | awk '{print $1,$6,$7,$9}' | column -t
    drwxr-xr-x+  Feb  3   .
    drwxrwxrwt+  Oct  9   ..
    -rw-------   Feb  12  .bash_history
    -rwxr-xr-x   Oct  9   .bash_profile
    -rwxr-xr-x   Feb  3   .bashrc
    drwx------+  Feb  2   .cache
    -rwxr-xr-x   Oct  9   .inputrc
    -rwxr-xr-x   Feb  14  .mkshrc
    -rwxr-xr-x   Oct  9   .profile
    drwxrwx---+  Dec  13  .ssh
    

    Note the -t flag used for column:

    -t, --table Determine the number of columns the input contains and create a table. Columns are delimited with whitespace, by default, or with the characters supplied using the --output-separator option. Table output is useful for pretty-printing.

    Another way would be to used fixed lengths:

    $ ls -al | sed 1d | awk '{printf "%-12s %-3s %-2s %s\n", $1,$6,$7,$9}'
    drwxr-xr-x+  Feb 3  .
    drwxrwxrwt+  Oct 9  ..
    -rw-------   Feb 12 .bash_history
    -rwxr-xr-x   Oct 9  .bash_profile
    -rwxr-xr-x   Feb 3  .bashrc
    drwx------+  Feb 2  .cache
    -rwxr-xr-x   Oct 9  .inputrc
    -rwxr-xr-x   Feb 14 .mkshrc
    -rwxr-xr-x   Oct 9  .profile
    drwxrwx---+  Dec 13 .ssh
    

    There is another example of this in the GNU Awk User's guide.