Intereting Posts
Как сменить ключ GPG на обычный пароль? Как разбить строку на какой-то разделитель непечатаемого символа? Насколько безопасны репозитории по умолчанию для Fedora, CentOS и Debian? openwrt: невозможно изменить параметр DNS-сервера, чтобы разрешить имена узлов FQDN Выясните PID точного приложения node.js Как пропустить подкаталоги в цикле for, основанном только на имени? как заставить rsync связывать идентичные файлы с параметром -link-dest, если старый файл уже существует? Удаление дополнительных нерабочих сканеров Мониторинг использования полосы пропускания от разных виртуальных хостов Таблицы маршрутизации и маршруты по умолчанию tr не заменяет апостроф Как заставить конфликт зависимости для контрольных показателей? Можно ли запускать несколько команд mv в одном каталоге (состояние гонки)? Как использовать Awk для форматирования чисел с разделителем тысяч Есть ли способ узнать, когда была установлена ​​файловая система?

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

Я использую:

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)