前言
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )
脚本
对一个developer 来说,脚本越来越重要,尤其在一些辅助性的事情的上面. 替换文本的一些内容,排序一些字符,代码中检测一下规范,等等.
好多时候,想把目录中的tree结构转成文本,或者想要的文档.
使用shell脚本就少不了sed和awk.今天来说下使用awk过程中的一些不解:
ls -l /Users/oker/ | awk '/^d/ {print $NF}
这里只会打印出来/Users/oker/目录下的子目录
同理
ls -l /Users/oker/ | awk '/^-/ {print $NF}
这里只会打印出来/Users/oker/目录下的文件
疑问?
awk中的/ /里面不应该是正则表达式么?在这里还是么?- 在正则表达式中
^是表示字符串中开始的位置.但是d该怎么理解?
如果我们按照正则表达式来理解,会发现d不知道该怎么解释,因为正则表达式中表示[0-9]的是\d.但是这里只有一个d,难道是匹配d开头的?
在查看许多文档之后发现一个类似的解释: awk
ls -l /usr/bin | awk '
$1 ~ /^-/ {t["Regular Files"]++}
$1 ~ /^d/ {t["Directories"]++}
$1 ~ /^l/ {t["Symbolic Links"]++}
END {for (i in t) print i ":\t" t[i]}
'
我们先来看下ls -l打印的什么
$ ls -l
-rw-r--r--@ 1 oker staff 1391 9 20 17:10 AuthSetting.h
-rw-r--r--@ 1 oker staff 5448 9 20 17:58 AuthSetting.m
-rw-r--r--@ 1 oker staff 1468 9 20 17:48 Context.h
-rw-r--r--@ 1 oker staff 1108 9 20 17:48 Context.m
drwxr-xr-x 4 oker staff 128 9 21 13:59 kycauth1
drwxr-xr-x 32 oker staff 1024 9 21 17:09 kycauth2
drwxr-xr-x 23 oker staff 736 9 20 17:10 kycauth3
drwxr-xr-x 20 oker staff 640 9 21 13:59 kychome
如果是文件最前面是-
如果是目录最前面是d
- 文件名中带有[ . ]开头的代表隐藏文件。

linux 文件权限
文件类型代码:[ d ]--目录、[ - ]--文件、[ l ]--链接、[ b ]--可储存周边设备、[ c ]--序列设备。
文件权限属性:[ r ]--可读、[ w ]--可写、[ x ]--可执行。
- 对于目录,必需具有执行权限才可进入
- 文件的执行属性将决定文件是否可执行,而与文件扩展名无关
从这里可以看出
/^d/是一个正常的正则,用来过滤是目录(Directories)/^-/是一个正常的正则,用来过滤是文件(Files)/^l/是一个正常的正则,用来过滤是链接(Links)