我没有得到我期望的输出,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}'