awk '/^d/' 的理解使用

3,863 阅读2分钟

前言

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )

脚本

对一个developer 来说,脚本越来越重要,尤其在一些辅助性的事情的上面. 替换文本的一些内容,排序一些字符,代码中检测一下规范,等等.

好多时候,想把目录中的tree结构转成文本,或者想要的文档. 使用shell脚本就少不了sedawk.今天来说下使用awk过程中的一些不解:

ls -l /Users/oker/ | awk '/^d/ {print $NF} 这里只会打印出来/Users/oker/目录下的子目录

同理 ls -l /Users/oker/ | awk '/^-/ {print $NF} 这里只会打印出来/Users/oker/目录下的文件

疑问?

  1. awk中的/ /里面不应该是正则表达式么?在这里还是么?
  2. 在正则表达式中^是表示字符串中开始的位置.但是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
    linux 文件权限

文件类型代码:[ d ]--目录、[ - ]--文件、[ l ]--链接、[ b ]--可储存周边设备、[ c ]--序列设备。

文件权限属性:[ r ]--可读、[ w ]--可写、[ x ]--可执行。

  • 对于目录,必需具有执行权限才可进入
  • 文件的执行属性将决定文件是否可执行,而与文件扩展名无关

从这里可以看出

  1. /^d/ 是一个正常的正则,用来过滤是目录(Directories)
  2. /^-/ 是一个正常的正则,用来过滤是文件(Files)
  3. /^l/ 是一个正常的正则,用来过滤是链接(Links)