2015-02-13 2 views
1

Мой вопрос может показаться довольно простым, я новичок в bash-скриптах, но я пытаюсь отформатировать свой вывод ls без использования вкладки, когда я печатаю с awk.Форматирование вывода ls без вкладок с помощью awk?

Вот моя текущая команда, я бегу:

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 
+0

Вы просто пытаетесь отформатировать его так, чтобы он выглядел как стол? – merlin2011

ответ

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, --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.

+1

Спасибо! column -t был определенно полезен! Я, вероятно, подумаю об этом, сделав псевдоним. – tbcrawford

+0

Когда вы выполняете 'ls -al', он показывает конечную косую черту для каталогов. т. е. '. /'. Есть ли способ избежать потери конечной косой черты? – Tom

+1

выглядит как '-p' трюк – Tom

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

Вам не нужно использовать sed для удаления первой строки. Awk может это сделать, если NR> 1 print

+0

Awesome! Спасибо за этот лакомый кусочек совета! – tbcrawford

1

Вы можете избежать всех ненужных труб, используя функции awk.

ls -al | awk -v OFS="\t" 'NR>1 { print $1, $6, $7, $9 }' 
  • Использование NR>1, чтобы избавиться от ненужного sed удалить первую строку.
  • Используйте переменную OFS, чтобы установить разделитель выходного поля на вкладку там, удалив необходимость в column.
+1

hey Jaypal, долгое время не вижу и поздравляет с переходом на Intuit – iruvar

+0

Спасибо @ 1_CR ':)'. –