Легко получить конкретный столбец из вывода без sed или awk

Есть ли более быстрый способ получить пару столбцов значений, чем futzing с sed и awk ?

Например, если у меня есть вывод ls -hal / и я хочу просто получить имена и размеры файлов и каталогов, как я могу легко и быстро это сделать, не тратя несколько минут на настройку моей команды.

 total 16078 drwxr-xr-x 33 root wheel 1.2K Aug 13 16:57 . drwxr-xr-x 33 root wheel 1.2K Aug 13 16:57 .. -rw-rw-r-- 1 root admin 15K Aug 14 00:41 .DS_Store d--x--x--x 8 root wheel 272B Jun 20 16:40 .DocumentRevisions-V100 drwxr-xr-x+ 3 root wheel 102B Mar 27 12:26 .MobileBackups drwx------ 5 root wheel 170B Jun 20 15:56 .Spotlight-V100 d-wx-wx-wt 2 root wheel 68B Mar 27 12:26 .Trashes drwxrwxrwx 4 root wheel 136B Mar 30 20:00 .bzvol srwxrwxrwx 1 root wheel 0B Aug 13 16:57 .dbfseventsd ---------- 1 root admin 0B Aug 16 2012 .file drwx------ 1275 root wheel 42K Aug 14 00:05 .fseventsd drwxr-xr-x@ 2 root wheel 68B Jun 20 2012 .vol drwxrwxr-x+ 289 root admin 9.6K Aug 13 10:29 Applications drwxrwxr-x 7 root admin 238B Mar 5 20:47 Developer drwxr-xr-x+ 69 root wheel 2.3K Aug 12 21:36 Library drwxr-xr-x@ 2 root wheel 68B Aug 16 2012 Network drwxr-xr-x+ 4 root wheel 136B Mar 27 12:17 System drwxr-xr-x 6 root admin 204B Mar 27 12:22 Users drwxrwxrwt@ 6 root admin 204B Aug 13 23:57 Volumes drwxr-xr-x@ 39 root wheel 1.3K Jun 20 15:54 bin drwxrwxr-t@ 2 root admin 68B Aug 16 2012 cores dr-xr-xr-x 3 root wheel 4.8K Jul 6 13:08 dev lrwxr-xr-x@ 1 root wheel 11B Mar 27 12:09 etc -> private/etc dr-xr-xr-x 2 root wheel 1B Aug 12 21:41 home -rw-r--r--@ 1 root wheel 7.8M May 1 20:57 mach_kernel dr-xr-xr-x 2 root wheel 1B Aug 12 21:41 net drwxr-xr-x@ 6 root wheel 204B Mar 27 12:22 private drwxr-xr-x@ 68 root wheel 2.3K Jun 20 15:54 sbin lrwxr-xr-x@ 1 root wheel 11B Mar 27 12:09 tmp -> private/tmp drwxr-xr-x@ 13 root wheel 442B Mar 29 23:32 usr lrwxr-xr-x@ 1 root wheel 11B Mar 27 12:09 var -> private/var 

Я понимаю, что есть варианты bazillion для ls и я мог бы, вероятно, сделать это для этого конкретного примера таким образом, но это общая проблема, и я бы хотел, чтобы общее решение для получения конкретных столбцов было легко и быстро.

cut не сокращает его, потому что он не принимает регулярного выражения, и у меня практически никогда не бывает ситуации, когда есть один пробел, ограничивающий столбцы. Это было бы прекрасно, если бы это сработало:

 ls -hal / | cut -d'\s' -f5,9 

awk и sed более общие, чем я хочу, в основном целые языки для себя. Я ничего не имею против них, просто потому, что, если я недавно много делаю с ними, это требует довольно значительного умственного сдвига, чтобы начать думать в своих терминах и написать что-то, что работает. Я обычно задумываюсь о какой-то другой проблеме, которую я пытаюсь решить, и внезапное решение проблемы sed / awk бросает мой фокус.

Есть ли гибкий ярлык для достижения того, что я хочу?

3 Solutions collect form web for “Легко получить конкретный столбец из вывода без sed или awk”

Я не уверен, почему

 ls -hal / | awk '{print $5, $9}' 

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

 ls -hal / | cut -d'\s' -f5,9 

было бы, если бы это сработало. Вы действительно должны это записать? Это займет всего несколько строк awk прежде чем добавлять {} становится автоматически. (Для меня самая сложная проблема – помнить, какой номер поля соответствует той части данных, но, возможно, у вас нет этой проблемы.)

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

Раздражающая проблема была бы, если бы вы хотели вывести символическую ссылку, а также имя файла, или если ваши имена файлов могут содержать пробелы. (Или, что еще хуже, новые строки). С гипотетическим выражением, выражающим регулярное выражение, это не проблема (за исключением новых строк); вы просто замените -f5,9 на -f5,9- . Однако нет синтаксиса awk для «полей от 9 до конца», и вам остается вспомнить, как писать цикл for.

Вот небольшой скрипт оболочки, который превращает опции cut -style -f в awk-программу, а затем запускает awk-программу. Это требует гораздо лучшей проверки ошибок, но, похоже, это работает. (Добавленный бонус: обрабатывает параметр -d , передавая его в awk-программу.)

 #!/bin/bash prog=\{ while getopts f:d: opt; do case $opt in f) IFS=, read -ra fields <<<"$OPTARG" for field in "${fields[@]}"; do case $field in *-*) low=${field%-*}; high=${field#*-} if [[ -z $low ]]; then low=1; fi if [[ -z $high ]]; then high=NF; fi ;; "") ;; *) low=$field; high=$field ;; esac if [[ $low == $high ]]; then prog+='printf "%s ", $'$low';' else prog+='for (i='$low';i<='$high';++i) printf "%s ", $i;' fi done prog+='printf "\n"}' ;; d) sep="-F$OPTARG";; *) exit 1;; esac done if [[ -n $sep ]]; then awk "$sep" "$prog" else awk "$prog" fi 

Быстрый тест:

 $ ls -hal / | ./cut.sh -f5,9- 7.0K bin 5.0K boot 4.2K dev 9.0K etc 1.0K home 8.0K host 33 initrd.img -> /boot/initrd.img-3.2.0-51-generic 33 initrd.img.old -> /boot/initrd.img-3.2.0-49-generic ... 

Я считаю, что нет более простого решения, чем sed или awk. Но вы можете написать свою собственную функцию.

Вот функция списка (скопируйте папку на свой терминал):

 function list() { ls -hal $1 | awk '{printf "%-10s%-30s\n", $5, $9}'; } 

затем используйте функцию списка:

 list / list /etc 

Вы не можете просто говорить о «столбцах», не объясняя также, что такое столбец!

Очень часто в текстовой обработке unix есть пробел как разделитель столбцов (поле) и (естественно) новая строка как разделитель строк или записей. Тогда awk – отличный инструмент, который очень читабельен:

 # for words (columns) 5 and 9: ls -lah | awk '{print $5 " " $9}' # or this, for the fifth and the last word: ls -lah | awk '{print $5 " " $NF}' 

Если столбцы вместо этого упорядочены по-разному, возможно, cut -c лучше.

 ls -lah | cut -c 31-33,46- 

Вы можете указать awk использовать другие разделители полей с опцией -F . Если вы не используете -c (или -b ) с cut , используйте -f чтобы указать, какие столбцы вывести.

Трюк – это знание о вводе

Вообще говоря, не всегда полезно анализировать вывод ls , df , ps и подобных инструментов с инструментами обработки текста, по крайней мере, если вы хотите быть переносимыми / совместимыми. В этих случаях попробуйте принудительно выполнить вывод в формате POSIX. Иногда это может быть достигнуто путем передачи определенной опции ( -P возможно) команде, генерирующей вывод. Иногда, устанавливая переменную среды, такую ​​как POSIXLY_CORRECT или вызывающую конкретную двоичную систему, например /usr/xpg4/bin/ls .

  • извлечение определенной строки, поиск и замена или сохранение более длинной строки содержат извлеченное значение
  • заменить шаблон между двумя символами
  • Awk / grep / sed получает разделенный запятыми список чисел из строк текста
  • Извлечь имя группы из `id` и сохранить ее в переменной
  • Условный awk через 4 столбца
  • sed + update /etc/grub.conf, несмотря на этот файл ссылки
  • Как добавить атрибут в тег в файле XML по командной строке?
  • Объединить и добавить столбцы для более чем двух файлов
  • sed with = в качестве разделителя
  • grep все строки, начинающиеся с определенного символа, и заканчиваются другим символом
  • как использовать tr для удаления восьмеричной последовательности символов?
  • Вставьте строку после блока текста с помощью sed
  • Interesting Posts

    Проверьте, действительно ли консольное приложение завершено

    Как настроить терминал так, чтобы щелчок мыши переместил курсор в текущую позицию мыши

    Монетный двор 17.3 Wi-Fi не работает после возобновления от приостановки

    Модем USB 56k не обнаружен

    overlayfs с большим количеством каталогов

    Существуют ли альтернативы использованию `udev`?

    Использование вывода команды для определения имени файла для перенаправления вывода на

    Как я могу получить команды sudo для использования настроек в /root/.bashrc

    Можете ли вы указать окно, чтобы появиться за другими?

    Как изменить сообщение об аутентификации пользователя?

    Как я могу получить относительную дату на основе относительной даты командой linux date?

    Как узнать, для чего этот процесс?

    разделите 1200 страниц документа на 500 страниц, а затем оставшиеся

    Уровень сжатия Mksquashfs

    Интерактивный диспетчер командной строки Shell vs X

    Linux и Unix - лучшая ОС в мире.