使用awk格式化ls输出而不使用制表符?

时间:2015-02-13 23:03:21

标签: linux bash unix awk ls

我的问题可能看起来相当简单,我仍然是bash脚本的初学者,但是当我用awk打印时,我试图在不使用标签的情况下格式化ls输出。

这是我正在运行的当前命令:

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

并打印出以下内容

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

我也尝试过使用空格:

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

打印以下内容(非常麻烦):

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

有没有办法让它看起来更漂亮?

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

3 个答案:

答案 0 :(得分:5)

我想到的一个自动选项是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

请注意-t使用的column标记:

  

-t, - 表格                 确定输入包含和创建的列数                 一张桌子。默认情况下,列用空格分隔                 或者使用--output-separator提供的字符                 选项。表输出对于漂亮打印非常有用。

另一种方法是使用固定长度:

$ 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

GNU Awk User's guide还有另一个例子。

答案 1 :(得分:1)

ls -al|awk  'NR>1{print $1,$6,$7,$9}'|column -t

您不需要使用sed删除第一行。如果NR> 1打印

,awk可以执行此操作

答案 2 :(得分:1)

您可以使用awk的功能来避免所有不必要的管道。

ls -al | awk -v OFS="\t" 'NR>1 { print $1, $6, $7, $9 }'
  • 使用NR>1删除不必要的sed以删除第一行。
  • 使用OFS变量将输出字段分隔符设置为选项卡,而不需要column