我想要获取所有包含 3 个字母且只有 3 个字母的命令

我想要获取所有包含 3 个字母且只有 3 个字母的命令

我没有得到我期望的输出,apropos -k . |awk '/^.../ {print $1}'我是不是想太多了?在这个示例输出中,只有 zsh 应该返回。我也试过这个

apropos -k . | awk '/^\w{3}$/ {print $1}'

以下是一个小例子

zmq_version
zmq_vmci
zmq_z85_decode
zmq_z85_encode
znew
zpool
zram-generator
zram-generator.conf
zramctl
zsh
zshall
zshbuiltins
zshcalsys
zshcompctl
zshcompsys
zshcompwid
zshcontrib
zshexpn
zshmisc
zshmodules

答案1

你的第一个正则表达式只检查是否存在至少三个字符——它不检查接下来的内容它们(即,字符后面可以跟第四个字母,也可以跟空格),并且它不受限制,$因此它很乐意匹配输入的开头,而不需要它匹配整个输入。

你的第二个正则表达式正确地完成了所有这些工作,但是(像第一个一样)它仍然适用于整条线路– 当然还有其他文本,例如命令描述。

对于整行正则表达式(您的第一次尝试),您还需要检查第 4 个字符,并要求那里有一个空格,而不是第 4 个字母或其他任何内容:

/^\w{3} / {print $1}

或者(对于您的第二次尝试),匹配第一个字段而不是整行(awk 默认自动将每行拆分为空格分隔的字段,除非通过 进行更改-F)并要求正则表达式匹配整个字段,而不仅仅是开头:

$1 ~ /^...$/ {print $1}
$1 ~ /^.{3}$/ {print $1}

或者#2,既然您正在处理单个字段,您也可以直接检查值的长度,而无需使用正则表达式:

length($1) == 3 {print $1}

答案2

ls /usr/bin/ | awk '{if (length($1) == 3) print $1}'

相关内容