如何将单列输出连接到列表中?

如何将单列输出连接到列表中?

我在用着:

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 列。

答案1

使用xargs

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

command部分是必要的,因为如果您的ls别名为ls --color例如,它会在其输出中添加非打印转义序列,以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'

答案2

一张长长的清单

使用 grep

您可以只使用 shell 扩展/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.指示仅返回-ogrep模式匹配的字符串。然后我们利用 Perl 的后视能力。因此,当我们找到以 开头的字符串时/proc,我们会查找 中/proc是否有任何不以数字 ( \D) 开头的字符串。这些是返回的字符串(非数字开头的字符串)。

grep该粘贴通过删除开始显示结果时添加的所有换行符来为我们进行一些清理。

使用 sed

此方法的替代方法是使用sed(嘿,押韵)。

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

/proc/这种方法找到所有以& 数字 & 空格开头的字符串,然后用任何内容替换它们,从而有效地删除它们。之后,我们执行另一个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

4 列也是同样的情况:

$ 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

笔记:根据 @JosephR. 的回答,如果您在解析 的输出时遇到上述命令的任何问题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

答案3

怎么样

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

答案4

ls仅在打印到终端时以列形式显示其输出。当其输出是文件或管道时,ls每行打印一项。

无论输出流的类型如何,您都可以使用该选项-C按列打印,但这将使得无法(或至少很难)使用grep.

您可以告诉ls忽略名称以数字开头的文件。这是获取输出的最简单方法,类似于ls /proc仅在没有进程目录的情况下的输出。

ls -I '[0-9]*'

或者,您可以指定要列出的条目。

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

如果您只想要条目而不关心外观或颜色,请使用 shell 通配符而不是ls.第二个命令特定于 zsh。

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

相关内容