Сортировка списка и отдельных элементов с запятыми вместо строк новой строки

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

cat /proc/filesystems | sed 's/nodev//' | sed 's/,$//' 

Мой вывод выглядит следующим образом:

 sysfs rootfs ramfs bdev proc cgroup cpuset tmpfs devtmpfs debugfs securityfs sockfs pipefs anon_inodefs devpts ext3 ext2 ext4 hugetlbfs vfat ecryptfs fuseblk fuse fusectl pstore mqueue binfmt_misc vboxsf системы sysfs rootfs ramfs bdev proc cgroup cpuset tmpfs devtmpfs debugfs securityfs sockfs pipefs anon_inodefs devpts ext3 ext2 ext4 hugetlbfs vfat ecryptfs fuseblk fuse fusectl pstore mqueue binfmt_misc vboxsf 

Как я могу изменить это на один вывод строки с запятыми, разделяющими каждую файловую систему?

Я понял часть его, используя xargs :

 cat /proc/filesystems | sed 's/nodev//' | xargs | sed -e 's/ /,/g' 

Теперь я хочу сделать вывод в формате словаря.

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

 awk '{printf "%s%s",(NR>1?",":""),$NF;} END{print""}' /proc/filesystems 

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

 sed -r 's/^nodev//; s/^[[:blank:]]*//; H;1h;$!d;x; s/\n/,/g' /proc/filesystems 

Как это работает

  • s/^nodev//

    Это исключает nodev от начала любой строки

  • s/^[[:blank:]]*//

    Это устраняет ведущие пробелы из каждой строки.

  • H

    Это добавляет текущую строку в пространство удержания.

  • 1h

    Если мы находимся в первой строке, замените пространство удержания на эту строку.

  • $!d

    Если мы не на последней строке, удалите пространство шаблонов и начните работу на следующей строке.

  • x; s/\n/,/g

    Если мы доберемся здесь, мы останемся последней. В этом случае переместите пространство удержания в пространство рисунка и замените все символы новой строки запятыми.

Чтобы понять это, он помогает распознавать H;1h;$!d;x как awk-айму, что означает чтение во всем файле.

Дополнительно: сортировка

Чтобы отсортировать имена:

 awk '{print $NF;}' /proc/filesystems | sort | awk '{printf "%s%s",(NR>1?",":""),$NF;} END{print""}' 

paste – инструмент для этого:

 sed 's/.*[[:blank:]]//' /proc/filesystems | paste -sd,