我想按字典顺序在单个逗号分隔列表中列出所有文件系统。我正在使用这个命令:
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
如何将其更改为单行输出,并用逗号分隔每个文件系统?
我通过使用以下方法弄清楚了其中的一部分xargs
:
cat /proc/filesystems | sed 's/nodev//' | xargs | sed -e 's/ /,/g'
现在我想让输出按字典顺序格式化。
答案1
使用 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""}'
答案2
paste
是用于此目的的工具:
sed 's/.*[[:blank:]]//' /proc/filesystems | paste -sd,