Как показать только последние k столбцов в ls -l?

sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb

Редактирование 1:

Я, как предполагается, объясняю это, таким образом...

Это излишне сложно. Я не знал, что в диапазонах адресов позволяют {}. Таким образом, я должен был выразить, "удаляют пустые строки" по-другому. Базовая команда t который является способом sed if ... then. T было бы легче, но доступен для GNU sed только. Я цитирую страницу справочника:

t маркировка: Если s///сделал успешную замену, так как последняя входная строка была считана и начиная с последнего t или команды T, то перейдите для маркировки; если маркировка опущена, ответвление к концу сценария.

Я злоупотребляю известным s команда. Это ничего не должно заменять кроме теста только, пуста ли строка. Таким образом, это заменяет пустую строку пустой строкой (мог использовать что-либо в качестве замены, поскольку строка удалена так или иначе).

Если s сделал "замену" затем, строка пуста. В этом случае команда d буду выполняться. Иначе ничто не должно быть сделано. Как t не переходит в случае s действие мне нужна команда ответвления b переходить в конец сценария. : label цели ответвления. Как goto тогда в средневековье (когда sed был изобретен..., хихикают).

Другая опция состояла бы в том, чтобы иметь s "замените" все непустые строки, делая s более сложный, но отдых легче команды:

sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input

^..*$ означает "непустую строку" и \1 означает "содержание первых скобок".

5
23.05.2015, 03:00
4 ответа

Краткое решение с использованием grep:

ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"

Здесь,

[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s          ==> space
{4}         ==> exactly four matches
-121--70716-

Это работает для меня:

ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'

Дополнительный флаг -n для ls превращает имена пользователей и групп в числовые идентификаторы. В результате мы получаем известное количество полей для выделения:

-rwxr-xr-x  1 1001 1001 1.4K Mar 23 18:07 something.sh

Пробел между каждым из столбцов является переменным, но это то, что ls использует для выравнивания столбцов, поэтому мы не можем просто слепо удалить его. Я решил удалить ведущий блок разрешений, за которым следуют три группы пробел-текст, а затем не пробел-текст , соответствующие количеству ссылок, uid и gid соответственно. Это оставляет пробел, отделяющий gid от файла, нетронутым, так что выравнивание может продолжать работать. Регулярное выражение sed реализует это удаление шаблона. #... #... # предоставляет разделители ( совпадают и заменить ), а флаг -r позволяет использовать расширенные регулярные выражения. Рассекая, что у нас есть ^ совпадающее начало строки; \S + соответствует одному или нескольким символам, не являющимся пробелами, и \s + соответствует одному или нескольким символам, не являющимся пробелами; скобки (...) объединяют эти два элемента, а скобки {3} указывают, что группа должна повторяться три раза.

 4.0K Jun  6  2014 template
 4.0K May 21 17:35 stuff
    0 Mar 16 09:46 Items
 1.4K Mar 23 18:07 something.sh
  24K May 19 14:45 curtain
-121--70714-

Для пропуска столбцов пользователя и группы используйте опции -o и -g . Поскольку имена пользователей и групп могут содержать пробелы, их невозможно надежно отредактировать.

Отсутствует возможность пропуска столбцов разрешений и количества ссылок. Поскольку первый столбец, который требуется сохранить, может начинаться с пробела (для выравнивания справа), в качестве критерия начала нельзя использовать переход от пробела к пробелю. Вместо этого используйте правый край последнего столбца, чтобы исключить ненужные столбцы. Это безопасно, поскольку первые два столбца не могут содержать встроенные пробелы.

ls -lhog | sed 's/^[^ ][^ ]*  *[^ ][^ ]* //'

Объяснение команды sed:

  • s/ REGEXP / REPLACEMENT / заменяет первое вхождение указанного регулярного выражения в каждой строке указанным текстом замены. Здесь текст замены пуст.
  • ^ в начале regexp делает его совпадающим только в начале строки.
  • [^] [^] * соответствует любой непустой последовательности символов, отличной от пробела.
  • Таким образом, команда sed удаляет первую и вторую последовательности без пробелов, а также следующее пространство (но только одно пространство в конце).
6
27.01.2020, 20:36

Это работает для меня:

ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'

Дополнительный флаг -n к ls превращает имена пользователей и групп в числовые идентификаторы. В результате мы получаем известное количество полей для выравнивания:

-rwxr-xr-x  1 1001 1001 1.4K Mar 23 18:07 something.sh

Пробела между каждым из столбцов переменны, но это то, что ls использует для выравнивания столбцов, поэтому мы не можем просто вырезать их вслепую. Я решил удалить ведущий блок разрешений, за которым следуют три группы пробельного текста, затем не пробельного текста, соответствующие счетчику ссылок, uid и gid соответственно. Это оставляет пробельные символы, отделяющие gid от файлов, нетронутыми, так что выравнивание может продолжаться. Регулярное выражение sed реализует это удаление шаблона. #...#...# предоставляет разделители (match и replace), а флаг -r позволяет использовать расширенные регулярные выражения. Отключая, что ^ совпадает с началом строки; \S+ совпадает с одним или несколькими небелопробельными символами, а \s+ с одним или несколькими пробелами; заключенный в скобки (. ...) группируют эти два элемента вместе, а в скобках {3} указано, что группа должна быть повторена три раза.

 4.0K Jun  6  2014 template
 4.0K May 21 17:35 stuff
    0 Mar 16 09:46 Items
 1.4K Mar 23 18:07 something.sh
  24K May 19 14:45 curtain
2
27.01.2020, 20:36

Присоединившись к хору, вы также можете использовать awk для опустошения колонок, которые вам не нужны:

[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'

    4.0K Aug 19 2014 Desktop
    4.0K Jan 8 22:39 dir1
    4.0K Feb 5 20:41 Documents
    12K May 22 19:31 Downloads
    4.0K Aug 19 2014 Music
    4.0K May 3 20:00 Pictures
    4.0K Aug 19 2014 Public
    115K May 9 09:05 something.bin
    4.0K Aug 19 2014 Templates
    1 Dec 12 07:01 testLink -> .
    4.0K Aug 19 2014 Videos
[jis@localhost ~]$ 
0
27.01.2020, 20:36

Отличное решение с использованием grep:

ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"

Здесь

[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s          ==> space
{4}         ==> exactly four matches
0
27.01.2020, 20:36

Теги

Похожие вопросы