Легко получить конкретный столбец из вывода без 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 бросает мой фокус.

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

  • Добавление запятых между элементами двоичной матрицы в текстовом файле
  • Возможно ли, с `sed` или иначе, применить преобразование регулярных выражений к входному потоку, который не может содержать строки новой строки?
  • Переупорядочить файл, чтобы он легко читался
  • Самый быстрый инструмент `uniq` в linux
  • Замените один блок текста на другой блок текста, когда заменяемый текст находится в файле
  • Замените строку в файле на другую, где оба сохраняются в переменных
  • Возвращайте только часть строки после соответствующего шаблона
  • 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 .

    Interesting Posts

    undefined symbol: _ZN5boost15program_options11to_internalERKSs

    Отключить сортировку COMPREPLY в полной функции bash

    Как сделать svn искать, если есть обновление раз в минуту, и если есть вызов какого-то скрипта?

    doublecmd, начинающийся очень медленно

    балансировка нагрузки multipie services linux

    Настройка команды promt в tcsh для отображения только 3-х рабочих каталогов вместо полного пути?

    Время выполнения сценария Ruby отличается локально, чем с SSH

    Latexmk, из Makefile, из скрипта bash, из Cron – Latexmk не выполняется

    Что такое systemd equvalent для sysvinit «X-Start-Before»?

    Не может ssh использовать PuTTy с действительным именем пользователя и паролем. Как убедиться, что сервер и клавиатура / терминалы PuTTy одинаковы? Другие вопросы?

    Как отключить повтор попыток пароля в команде ssh

    Что делает команда sed в строке ниже?

    Как установить парольную фразу на USB-накопитель?

    pkill -P $ ID работает во время kill – – $ ID не

    WCHAN = 0 для спящей задачи?

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