我在用着:
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
.指示仅返回-o
与grep
模式匹配的字符串。然后我们利用 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)