NO16 第二关课后考试-aw-F-过滤已知的一级目录

 

·总结的经验:
1、学会总结时学好运维的重要前提。
2、通过案列或例子来总结一个技术点或者命令。
3、画一张逻辑图,形象的卡通记忆这个知识技术点。
4、通过管道过滤数据时,最好先输出结果,然后回退再使用管道看着结果过滤。


一、如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是以及目录)?

分析过程:要完成此题,我们首先要想如何区分目录和文件?
1 根据颜色区分
2 ls -l 输出结果中以d(directory)开头的就是目录
3 ls -l 输出结果中第二列数字大于1的就是目录(文件没有硬链接的情况下是对的)
4 通过给目录加标识,然后通过滤标识就过滤出目录
 (ls -F给不同文件加不同符号 或ls -p 只给目录加斜线)
5 通过find直接查找指定类型的文件(-d就是目录)

创建环境:
[root@localhost oldboy]# mkdir ext/oldboy 1 2 3 4 a b c d -p
[root@localhost oldboy]# tree
.
├── 1
├── 123.log
├── 2
├── 3
├── 4
├── a
├── b
├── c
├── d
├── ext
│   └── oldboy
└── oldboy

11 directories, 1 file
[root@localhost oldboy]# ls -l
total 696
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
-rw-r--r-- 1 root root 712614 Apr  1 00:16 123.log
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy
[root@localhost oldboy]# ls -F   (给目录加标识,-F 给不同文件加不同符号)
1/  123.log  2/  3/  4/  a/  b/  c/  d/  ext/  oldboy/
[root@localhost oldboy]# ls -p   (给目录加标识,-p 只给目录加斜线)
1/  123.log  2/  3/  4/  a/  b/  c/  d/  ext/  oldboy/


方法一:
[root@localhost oldboy]# ls -l|grep "^d"
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy

方法二:
[root@localhost oldboy]# ls -F
1/  123.log  2/  3/  4/  a/  b/  c/  d/  ext/  oldboy/
[root@localhost oldboy]# ls -F|grep "/$"       (/$:以/为结尾的)
1/
2/
3/
4/
a/
b/
c/
d/
ext/
oldboy/

方法三:
[root@localhost oldboy]# find ./ -maxdepth 1 -type d   (-maxdepth 1表示查找命令的深度)
./    (./*比./多个*:表示只找./目录下的不包括./目录本身,这里就有./本身)
./1
./2
./3
./4
./a
./b
./c
./d
./oldboy
./ext
[root@localhost oldboy]# find ./* -maxdepth 1 -type d  (./*比./多个*:表示只找./目录下的不包括./目录本身)
./1
./2
./3
./4
./a
./b
./c
./d
./ext
./ext/oldboy   (怎么去掉这个子目录?-type d后面加 ! -name ".")
./oldboy
[root@localhost oldboy]# find . -maxdepth 1 -type d ! -name "."
./1
./2
./3
./4
./a
./b
./c
./d
./oldboy
./ext

方法四:(第二列数字大于1的就是目录)
[root@localhost oldboy]# ls -l
total 696
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
-rw-r--r-- 1 root root 712614 Apr  1 00:16 123.log
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy
[root@localhost oldboy]# ls -l|awk '{if($2>1) print $0}'  ($2>1,第二列大于1。$0输入整行)
total 696
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy

方法五:
[root@localhost oldboy]# ls -dl */    (这个不常用)
drwxr-xr-x 2 root root  6 Jun  1 02:39 1/
drwxr-xr-x 2 root root  6 Jun  1 02:39 2/
drwxr-xr-x 2 root root  6 Jun  1 02:39 3/
drwxr-xr-x 2 root root  6 Jun  1 02:39 4/
drwxr-xr-x 2 root root  6 Jun  1 02:39 a/
drwxr-xr-x 2 root root  6 Jun  1 02:39 b/
drwxr-xr-x 2 root root  6 Jun  1 02:39 c/
drwxr-xr-x 2 root root  6 Jun  1 02:39 d/
drwxr-xr-x 3 root root 20 Jun  1 02:41 ext/
drwxr-xr-x 2 root root  6 Jun  1 02:39 oldboy/

方法六:
[root@localhost oldboy]# ls -l|sed -n '/^d/p'   (sed命令过滤功能记一下,^d表示以d开头)
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy

[root@localhost oldboy]# ls -F|sed -n '/\/$/p'  (也可以过滤以/结尾的)
1/
2/
3/
4/
a/
b/
c/
d/
ext/
oldboy/


方法七:
[root@localhost oldboy]# ls -l|awk '/^d/'        (awk命令过滤功能记一下,^d表示以d开头)
drwxr-xr-x 2 root root      6 Jun  1 02:39 1
drwxr-xr-x 2 root root      6 Jun  1 02:39 2
drwxr-xr-x 2 root root      6 Jun  1 02:39 3
drwxr-xr-x 2 root root      6 Jun  1 02:39 4
drwxr-xr-x 2 root root      6 Jun  1 02:39 a
drwxr-xr-x 2 root root      6 Jun  1 02:39 b
drwxr-xr-x 2 root root      6 Jun  1 02:39 c
drwxr-xr-x 2 root root      6 Jun  1 02:39 d
drwxr-xr-x 3 root root     20 Jun  1 02:41 ext
drwxr-xr-x 2 root root      6 Jun  1 02:39 oldboy

[root@localhost oldboy]# ls -F|awk '/\/$/'    (也可以过滤以/结尾的)
1/
2/
3/
4/
a/
b/
c/
d/
ext/
oldboy/

 

 

上述方法总结:
一、ls -l|grep "^d"   
    #以d开头的

二、ls -l|awk '{if($2>1) print $0}' 
    #第二列数字大于1的

三、ls -F|grep "/$"  
    #给目录加标识,-F 给不同文件加不同符号
      ls -p|grep "/$"  
    #给目录加标识,-p 只给目录加斜线         

四、find . -maxdepth 1 -type d ! -name "."   
    #find加深度-maxdepth,类型d,然后取反,不包含名字为.的当前目录。

五、[root@localhost oldboy]# ls -dl */    (这个不常用)

六、[root@localhost oldboy]# ls -l|sed -n '/^d/p' (sed命令过滤功能记一下,^d表示以d开头)
    [root@localhost oldboy]# ls -F|sed -n '/\/$/p'  (也可以过滤以/结尾的)

七、[root@localhost oldboy]# ls -l|awk '/^d/' (awk命令过滤功能记一下,^d表示以d开头)
    [root@localhost oldboy]# ls -F|awk '/\/$/'    (也可以过滤以/结尾的)

 

awk命令:

·awk        #(三剑客老大)过滤,输出内容,自成一门语言。 NR:行号
              $1,2...  第一,二...列以此类推。但$0:标识一行。
              -F 指定分隔符(-F ":"以:为分隔。$NF是最后一列。$1,$4,$NF逗号让结果间有空格)
                 [root@localhost oldboy]# tail -1 /etc/passwd
                 oldboy:x:1001:1001::/home/oldboy:/bin/bash
                 [root@localhost oldboy]# awk -F ":" 'NR==1 {print $6}' /etc/passwd
                 /root
                 [root@localhost oldboy]# awk -F ":" 'NR==1 {print $NF}' /etc/passwd
                 /bin/bash
                 [root@localhost oldboy]# awk -F ":" 'NR==1 {print $1,$4,$NF}' /etc/passwd
                  root 0 /bin/bash

 

 

 


Linux三剑客(只适合grep,sed,awk)正则表达式,对普通命令不适合(通配符)
1 ^    #以...开头,^d,意思是以d开头
2 $    #以...结尾,/$,意思是以/结尾
3 \    #让原本有意义的字符脱掉马甲,还原它本身的含义
4 .    #代表任意单个字符
5 *    #代表所有

 

posted @ 2018-05-03 18:12  Sinsen柳  阅读(148)  评论(0编辑  收藏  举报