【问题标题】:Formatting ls output without tab using awk?使用awk格式化没有标签的ls输出?
【发布时间】:2015-04-15 02:56:11
【问题描述】:

我的问题可能看起来相当简单,我仍然是 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

【问题讨论】:

  • 你只是想把它格式化成一个表格吗?

标签: linux bash unix awk ls


【解决方案1】:

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

注意用于column 的-t 标志:

-t, --table 确定输入包含的列数并创建 一张桌子。默认情况下,列用空格分隔, 或使用 --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 中还有另一个例子。

【讨论】:

  • 谢谢! column -t 绝对有帮助!我可能会考虑用这个做一个别名。
  • 当您执行ls -al 时,它会显示目录的尾部斜杠。即./。有没有办法避免丢失斜杠?
【解决方案2】:
ls -al|awk  'NR>1{print $1,$6,$7,$9}'|column -t

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

,awk 可以做到这一点

【讨论】:

  • 太棒了!感谢您的建议!
【解决方案3】:

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

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

【讨论】:

  • 嘿 Jaypal,好久不见,恭喜您改用 Intuit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2016-12-23
相关资源
最近更新 更多