如何编写awk正则匹配三类文件并对ls输出按类型着色
实现方案
你只需要在现有awk代码的$8着色处理之后、print语句之前插入第9列的匹配着色逻辑即可,注意判断顺序要优先匹配隐藏目录(避免隐藏目录被普通目录的规则优先匹配)。
完整修改后代码
ls -lhAXF --group-directories-first "$@" | awk ' BEGIN { FPAT = "([[:space:]]*[^[:space:]]+)"; } { $1 = "\033[1m\033[31m" $1 "\033[0m"; $2 = "\033[1m\033[32m" $2 "\033[0m"; $3 = "\033[1m\033[33m" $3 "\033[0m"; $4 = "\033[34m" $4 "\033[0m"; $5 = "\033[1m\033[35m" $5 "\033[0m"; $6 = "\033[1m\033[36m" $6 "\033[0m"; $7 = "\033[1m\033[37m" $7 "\033[0m"; $8 = "\033[1m\033[33m" $8 "\033[0m"; # 以下为新增的第9列着色逻辑 if ($9 ~ /^\s*\./ && $9 ~ /\/$/) { # 隐藏目录:以.开头且以/结尾 $9 = "\033[1m\033[34m" $9 "\033[0m"; } else if ($9 ~ /\/$/) { # 普通目录:仅以/结尾 $9 = "\033[1m\033[31m" $9 "\033[0m"; } else { # 普通文件:不满足上述两个条件 $9 = "\033[1m\033[32m" $9 "\033[0m"; } print }'
逻辑说明
- 匹配优先级:先判断是否同时满足「开头是.」+「结尾是/」的隐藏目录规则,再判断仅满足「结尾是/」的普通目录规则,剩余内容归为普通文件,避免逻辑覆盖
- 颜色对应:蓝色
\033[34m对应隐藏目录,红色\033[31m对应普通目录,绿色\033[32m对应普通文件,可按需调整是否加\033[1m加粗前缀 - 匹配规则加了
\s*兼容文件名前的空白字符,适配你设置的FPAT字段分割规则
内容的提问来源于stack exchange,提问作者Nasrun Minallah Bin Piee
相关产品推荐
相关产品推荐

