1

Я хотел бы использовать AWK, чтобы удалить первые 8 столбцов из следующего вывода:


ls -l

lrwxrwxrwx 1 user user   23 jul 27 00:04 file1.pdf
-rw-rw-r-- 1 user user  107 may  8 13:59 file 2 with spaces.mp3
lrwxrwxrwx 1 user user   11 jul 24 19:43 file3-with-hyphens.txt
lrwxrwxrwx 1 user user   11 jul 24 19:43 and_another_file4_with_underscores.md
-rw-rw-r-- 1 user user  107 may  8 13:59 file 5 with way more spaces than the rest.mp3

и отправьте результат в текстовый файл. Я могу сделать это вручную в vim с визуальным выбором блока, однако я бы предпочел иметь скрипт для этого автоматически.

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

Мой окончательный код следующий:

awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 ~/file_folder_content.txt | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 | ... | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 >> ~/file_folder_content.txt

Примечание 1: я ожидаю, что фактический вывод команды ls будет намного больше, чем этот.

Примечание 2: я попытался напечатать 9-е поле, но так как некоторые имена файлов содержат пробелы, это печатает только первое слово в имени файла.

2 ответа2

1

Это должно делать то, что вы хотите в awk:

ls -l | awk '$9~/./{for (i=1;i<9;i++){$i=""}; gsub(/^ +/,""); print}'

Вот немного другой подход в perl:

ls -l | perl -lane 'if ($F[7]=~/./) {s/.*$F[7]//; print}'

Примечание: я не могу не рекомендовать вам тщательно подумать о том, чего вы на самом деле хотите достичь, поскольку могут быть более эффективные способы. Как уже упоминалось в @confetti, просто печатать имена файлов проще с помощью ls -1 .

Примечание. Как правильно указано в комментариях, это решение не является надежным. Я бы добавил, что никакой разбор ls может считаться целым и невредимым.

Изучение AWK: Поскольку OP объяснил в комментариях, что этот вопрос является частью более широкого стремления стать опытным в AWK, у меня есть несколько рекомендаций.

0

Это похоже на проблему XY. ls -1 должен напечатать то, что вы хотите. Этот параметр требуется POSIX, поэтому вряд ли ваш ls его не поддерживает.

Однако, если вы собираетесь анализировать результат, вам вообще не следует использовать ls . Используйте find , желательно с действием -print0 .

Так что ls не правильный инструмент. Если вы все равно настаиваете на парсинге вывода ls , то awk может оказаться неподходящим инструментом. Обоснование:

  • Ваши столбцы разделены пробелами; иногда есть два или три последовательных пробела, это отличается от строки к строке. Таким образом, с этим наивным разделителем имя файла в одной строке может начинаться с N-го столбца, а с другой строки - с (N+1) -го столбца.
  • Вы можете указать awk рассматривать несколько пробелов как один разделитель (awk -F ' +'), но это будет искажать имена файлов с множеством последовательных пробелов.
  • Поэтому вам нужна логика, чтобы определить, где имя файла начинается в каждой строке. Это можно сделать (я думаю, что awk завершен по Тьюрингу), но я не могу дать вам никакого рабочего решения.

Даже вывод ls -1 не должен анализироваться, ls -l хуже.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .