Intereting Posts
Значения дневного / временного значения для обеспечения длины 3 цифры Планирование процесса и выделение ядра на больших процессорах .LITTLE Различные выходы на разные терминалы в Ubuntu Как правильно установить программное обеспечение на Linux Mint? как запустить оболочку на удаленном сервере с правами root Как добавить некоторую строку в соответствие с предыдущей строкой, сопоставленной с sed? Debootstrap debian в root с SW RAID1 Как сделать netstat, который будет фильтровать только на основе pid Шестнадцатеричные коды для комбинаций входных ключей Восстановление резервной копии Linux на виртуальной машине Как запустить SSD trim fstrim на btrfs при установке нескольких подвоев? Найдите 50 лучших каталогов, содержащих большинство файлов / каталогов на первом уровне? Как устранить эту ошибку при перезапуске apache2? Почему текущий каталог не изменяется в make-файле? Резервное копирование с помощью Google диска

Как я могу объединить один столбец вывода в список?

Я использую:

ls /proc | grep -v "^[0-9].*" 

получить список всех файлов и каталогов в / proc, которые не начинаются с чисел. Вывод представляет собой один список столбцов, то есть:

 acpi asound buddyinfo bus 

Как я могу сделать это несколько столбцов или список элементов, то есть:

 acpi asound buddyinfo bus 

или

 acpi,asound,buddyinfo,bus 

Я пытался:

 $ ls /proc | grep -v "^[0-9].*" | column -c5 

но все же получил 1 столбец.

Использовать xargs :

 $ command ls /proc | grep -v "^[0-9].*" | xargs 

Компонент command необходим, потому что, если ваш ls псевдоним ls --color например, он добавляет к распечатке escape-последовательности вне печати, которые grep каким-то образом просматривает и производит нежелательные результаты.


Другие варианты

Если вы не против изменения PWD :

 $ cd /proc && echo [^0-9]* 

Если вы не хотите изменять свой PWD :

 $ pushd . &>/dev/null && cd /proc && echo [^0-9]* && popd &>/dev/null 

Или:

 $ echo /proc/[^0-9]* | sed 's!/proc/!!g' 

Один длинный список

Использование grep

Вы можете просто использовать расширение оболочки в /proc и передать его в grep :

 $ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d '' 

пример

 $ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d '' acpi asound buddyinfo bus cgroups .... 

Вышеизложенное использует способность grep использовать механизм регулярных выражений Perl (PCRE). Это переключатель -P для grep . -o указывает grep только возвращать строки, соответствующие шаблону. Затем мы используем способность Perl к lookbehinds. Поэтому, когда мы находим строку с существами с /proc , мы также /proc за /proc для любых строк, которые не начинаются с цифры ( \D ). Это строки, которые возвращаются (незнатные стартовые).

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

Использование sed

Альтернативой этому методу было бы использовать sed вместо этого (эй, что рифмы).

 $ echo /proc/* | sed 's@/proc/[0-9]\+ @@g;s@/proc/@@g' 

Этот подход находит все строки, начинающиеся с /proc/ & digits & space, и заменяет их ничем, эффективно удаляя их. После этого мы делаем еще одну команду sed которая делает то же самое с строками /proc/ , и у нас останутся только стартовые строки без цифр.

Несколько столбцов

Для «сортировки» вывода в столбцы команда paste делает это довольно легко. Здесь я делаю 2 столбца, но вы можете изменить команду paste чтобы сгенерировать более или менее, добавив дополнительные тире ( - ). column -t в конце заставляет вывод выравниваться по столбцам.

 $ ls /proc | grep -v "^[0-9].*" | paste - - | column -t 

пример

Первые 5 строк вывода благодаря head -5 .

 $ ls /proc | grep -v "^[0-9].*" | paste - - |column -t | head -5 acpi asound buddyinfo bus cgroups cmdline cpuinfo crypto devices diskstats 

Вот то же самое с четырьмя столбцами:

 $ ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5 acpi asound buddyinfo bus cgroups cmdline cpuinfo crypto devices diskstats dma dri driver execdomains fb filesystems fs interrupts iomem ioports 

ПРИМЕЧАНИЕ . Ответ на @ Джозеф Р., если вы столкнулись с некоторыми проблемами с вышеприведенными командами, которые обрабатывают вывод из ls , вы можете префикс его командой Bash, command , которая будет обходить любые псевдонимы, которые могут иметь место для ls .

пример

 $ command ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5 acpi asound buddyinfo bus cgroups cmdline cpuinfo crypto devices diskstats dma dri driver execdomains fb filesystems fs interrupts iomem ioports 

Как насчет

 ls /proc | grep -v "^[0-9].*" | perl -pe 's/\n/,/' 

Как насчет того, чтобы использовать расщепление слов bash на основе IFS в сочетании с подстановкой команд (при условии, что IFS умолчанию)

 echo $(ls /proc | grep -v "^[0-9].*") acpi buddyinfo bus cmdline cpuinfo..... 

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

Вы можете использовать параметр -C для печати в столбцах, независимо от типа выходного потока, но это сделает невозможным (или, по крайней мере, жестко) фильтровать выход с помощью grep .

Вы можете сказать ls игнорировать файлы, имя которых начинается с цифры. Это самый простой способ получения вывода, который похож на вывод из ls /proc только без каталогов процессов.

 ls -I '[0-9]*' 

Кроме того, вы можете указать, какие записи вы хотите перечислить.

 (cd /proc && ls -d [!0-9]*) 

Если вы просто хотите записи и не заботитесь о презентации или цветах, используйте групповые символы оболочки вместо ls . Вторая команда специфична для zsh.

 (cd /proc && echo [!0-9]*) echo /proc/[^0-9]*(:t)