课程笔记

第三周

 

作者:梅珈玮

归档:学习笔记

2016/10/31

 

快捷键:

Ctrl + 1    标题1

Ctrl + 2    标题2

Ctrl + 3    标题3

Ctrl + 4    实例

Ctrl + 5    程序代码

Ctrl + 6    正文

格式说明:

蓝色字体:注释

×××背景:重要

绿色背景:注意


                            spacer.gif

老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结

学无止境,老男孩教育成就你人生的起点!

联系方式:

网站运维QQ交流群:

Linux  385168604

架构师 390642196

Python 29215534

大数据 421358633

官方网站:

http://www.oldboyedu.com


 

1 Linux文件属性体系知识超细精讲... 1

1.1 linux文件属性描述... 1

1.2 Linux文件属性——索引节点inode深度讲解,及扩展文件数据block. 2

1.2.1 Inode(文件属性)和block(文件内容)的关系... 2

1.2.2 查看系统容量:statdumpe2fsdf. 3

1.2.3 磁盘容量小结:... 4

1.2.4 有关Inode的小结... 4

1.2.5 有关block的小结... 5

1.2.6 总的小结... 6

1.2.7 企业面试题... 7

1.2.8 企业案例... 7

1.3 Linux文件属性——文件类型知识深度讲解... 8

1.3.1 普通文件:- (regular file). 8

1.3.2 目录文件:d (directory). 8

1.3.3 字符设备或块设备文件:b (block). 8

1.3.4 Linux文件后缀名... 9

1.4 Linux文件属性——文件权限基础介绍... 10

1.5 Linux文件属性——软硬链接知识深度讲解... 10

1.5.1 ln命令... 10

1.5.2 硬链接(相当于block的多个入口)... 11

1.5.3 软链接(相当于快捷方式)... 12

1.5.4 有关文件的硬链接与软链接的区别... 14

1.5.5 有关目录的硬链接与软链接的区别... 15

1.5.6 企业面试题11. 15

1.6 Linux文件属性——文件删除的原理... 16

1.6.1 Linux下文件删除的原理... 16

1.6.2 Linux下文件删除——企业生产故障案例... 16

1.6.3 企业面试题12. 18

1.7 Linux文件属性——用户和组基础知识介绍... 19

1.7.1 Linux系统中用户角色划分... 19

1.7.2 超级用户... 19

1.7.3 普通用户:... 19

1.7.4 虚拟用户:... 20

1.7.5 查看用户UIDGID,以及区分特殊用户、普通用户、超级用户的方法... 20

1.7.6 用户组... 21

1.7.7 用户及用户组配置文件介绍... 22

1.8 Linux文件属性——时间戳及文件名属性知识讲解:... 25

1.8.1 Linux文件属性——时间戳... 25

1.8.2 Linux文件属性——文件名属性... 26

2 Linux通配符-正则表达式原理及深度实践精讲... 26

2.1 Linux通配符和三剑客正则表达式的区别... 26

2.1.1 *号举例... 27

2.1.2 ?号举例... 28

2.1.3 ;号举例... 28

2.1.4 #号举例... 28

2.1.5 |号举例... 28

2.1.6 ‘’单引号举例... 28

2.1.7 “”双引号举例... 28

2.1.8 单、双引号的区别举例... 29

2.1.9 {}大括号举例... 30

2.2 Linux正则表达式基础... 31

2.2.1 正则表达式第一波:... 31

2.2.2 正则表达式第二波:... 31

2.2.3 正则表达式第三波:... 34

2.3 Linux正则表达式基础小结... 36

2.4 Linux三剑客之grep常用参数详细总结... 36

2.5 正则表达式扩展部分:egrepgrep -E.. 37

2.5.1 egrep “+”. 37

2.5.2 egrep “?”. 39

2.5.3 egrep “|”. 39

2.5.4 egrep “()”. 39

2.5.5 正则表达式的拓展的小结... 39

2.6 linux正则表达式结合三剑客企业级深度实践案例... 40

2.6.1 取系统IP. 40

2.6.2 /etc/passwd文件中第一列和最后一列的数据调换。(同:第一节的课后考试题第八题)... 41

2.6.3 取系统IP. 42



第1章 Linux文件属性体系知识超细精讲*

1.1 linux文件属性描述

[root@oldboy ~]# ls –li    【-i,inode节点号的简写】

total 44

403351 -rw-------. 1 root root  1133 Oct 1411:33 anaconda-ks.cfg

393683 -rw-r--r--. 1 root root     0 Oct 22 09:13 -help

390149 -rw-r--r--. 1 root root 22179 Oct 14 11:33 install.log

390150 -rw-r--r--. 1 root root  5890 Oct 1411:31 install.log.syslog

390375 drwxr-xr-x 2 root root  4096 Oct 31 18:20 test

[root@oldboy ~]# ls –lih   【-h,humun reader】

total 44K

403351 -rw-------. 1 root root 1.2K Oct 14 11:33 anaconda-ks.cfg

393683 -rw-r--r--. 1 root root    0 Oct 22 09:13 -help

390149 -rw-r--r--. 1 root root  22K Oct 1411:33 install.log

390150 -rw-r--r--. 1 root root 5.8K Oct 14 11:31 install.log.syslog

390375 drwxr-xr-x 2 root root 4.0K Oct 31 18:20 test

spacer.gif

spacer.gif

spacer.gif

spacer.gif

spacer.gif

扩展:查看文件或目录大小,还可用du –sh;而且细心发现,一个目录的大小是一个block的大小4.0K

spacer.gif

1.2 Linux文件属性*——索引节点inode深度讲解,及扩展文件数据block

1.2.1 Inode(文件属性)和block(文件内容)的关系

spacer.gif

举个例子:

spacer.gif

1.2.2 查看系统容量:statdumpe2fsdf

[root@oldboy ~]# stat /etc/hosts 【stat,可以查看文件详细信息】

  File:`/etc/hosts'

  Size:158         Blocks: 8          IO Block:4096   regular file

Device: 803h/2051d  Inode:260127      Links: 2

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-12-25 00:05:20.201999753 +0800

Modify: 2010-01-12 21:28:22.000000000 +0800

Change: 2016-10-14 11:45:53.279130894 +0800

spacer.gif

 

[root@oldboy ~]# dumpe2fs /dev/sda1     【dumpe2fs查看文件内部信息;sda1指:查看sata磁盘第一块盘a,第一个分区的】

[root@oldboy ~]# dumpe2fs /dev/sda1 |grep -i"inode size" 【过滤磁盘第一块盘a,第一个分区inode大小】

dumpe2fs 1.41.12 (17-May-2010)

Inode size:           128

[root@oldboy ~]# dumpe2fs /dev/sda2 |grep -i"inode size" 【过滤磁盘第一块盘a,第二个分区inode大小】

dumpe2fs 1.41.12 (17-May-2010)

dumpe2fs: Bad magic number in super-block whiletrying to open /dev/sda2

[root@oldboy ~]# dumpe2fs /dev/sda3 |grep -i"inode size" 【过滤磁盘第一块盘a,第三个分区inode大小】

dumpe2fs 1.41.12 (17-May-2010)

Inode size:           256

[root@oldboy ~]# df –h                 【df –h查看硬盘hardware容量】

Filesystem     Size  Used Avail Use% Mounted on

/dev/sda3      8.8G  1.5G  7.0G 17% /

tmpfs          491M     0  491M  0% /dev/shm

/dev/sda1      190M   36M  145M 20% /boot

[root@oldboy ~]# df –i                 【df –i查看文件属性inode的容量】

Filesystem    Inodes IUsed  IFree IUse% Mountedon

/dev/sda3     593344 55883 537461   10% /

tmpfs         125596     1 125595    1% /dev/shm

/dev/sda1      51200    38  51162   1% /boot

1.2.3 磁盘容量小结:

磁盘空间是否满了,是由两项参数决定的:

第一个是inode(存放文件属性的空间)是否满了;第二个是block(存放文件数据的空间)是否满了;任何一项满了,都无法存储

磁盘满的一个特征(no space on device left

企业案例:为什么用df -h查看空间,明明空间没满,但是写入文件却提示满?

那是因为inode满了

1.2.4 有关Inode的小结

spacer.gif

spacer.gif

spacer.gif

[root@oldboy ~]# dumpe2fs /dev/sda3|egrep -i"block size|inode size" 【查看block和inode的大小】

dumpe2fs 1.41.12 (17-May-2010)

Block size:               4096

Inode size:           256

[root@oldboy ~]# dumpe2fs /dev/sda3|egrep -i"block count|inode count"【查看block和inode的总量】

dumpe2fs 1.41.12 (17-May-2010)

Inode count:              593344

Block count:              2373376

Reserved block count:     118668

默认block count一般会大于inode count的数量

spacer.gif

spacer.gif

1.2.5 有关block的小结

spacer.gif

spacer.gif

spacer.gif

spacer.gif

1.2.6 总的小结

1)、磁盘分区被格式化文件系统后,会分为inodeblock




spacer.gif

spacer.gif

1.2.7 企业面试题



1.2.8 企业案例1

spacer.gif

spacer.gif

1.3 Linux文件属性——文件类型知识深度讲解


 

1.3.1 普通文件:- (regular file)

spacer.gif

1.3.2 目录文件:d (directory)

ls -F /etc/ | grep "/$",表示筛选出以/结尾的文件,就是目录;

ls -l /etc/ |grep "^d" ,表示筛选出以d开头的文件,就是目录

1.3.3 字符设备或块设备文件:b (block)

spacer.gif

spacer.gif

1.3.4 Linux文件后缀名

spacer.gif

1.4 Linux文件属性——文件权限基础介绍

spacer.gif

1.5 Linux文件属性——软硬链接知识深度讲解

1.5.1 ln命令

ln [源文件] [目标硬链接]

ln –s [源文件] [目标软链接]

1.5.2 硬链接(相当于block的多个入口)

spacer.gif

spacer.gif

[root@oldboy /]# cd test

[root@oldboy test]# echo 1 > a

[root@oldboy test]# cat a

1

[root@oldboy test]# ln a b

[root@oldboy test]# ls

a  b

[root@oldboy test]# cat b

1

[root@oldboy test]# ls -hil a b

403365 -rw-r--r-- 2 root root2 Nov  1 04:29 a

403365 -rw-r--r-- 2 root root2 Nov  1 04:29 b

[root@oldboy test]# rm -f a

[root@oldboy test]# ls

b

[root@oldboy test]# cat b

1

1.5.3 软链接(相当于快捷方式)

spacer.gif

[root@oldboy test]# echo 1 > oldboy

[root@oldboy test]# ls

oldboy

[root@oldboy test]# cat oldboy

1

[root@oldboy test]# ln -s oldboy oldboy_soft

[root@oldboy test]# ls

oldboy oldboy_soft

[root@oldboy test]# ls -hil

total 4.0K

403365 -rw-r--r-- 1 root root 2 Nov  1 05:10oldboy

403366 lrwxrwxrwx 1 root root 6 Nov  1 05:10 oldboy_soft-> oldboy

【inode不一样,而且权限不同,但是软链接打开的文件权限,始终还是取决于源文件的文件权限,也就是取决于源文件的inode属性】

spacer.gif

 

删除源文件,链接文件还存在,但是就显示找不到源文件,显示样式如下:

spacer.gif

其中!ln,表示执行最近的一次ln命令

 

spacer.gif

1.5.4 有关文件的硬链接与软链接的区别

spacer.gif

1.5.5 有关目录的硬链接与软链接的区别

spacer.gif

spacer.gif

由上图可知,本身当前目录是一个,当前目录的点是一个,下级目录的点点是一个,所以一共3个。而且inode相同,说明是同一个目录,互为硬链接。由于硬链接文件和源文件的inode是相同的,而文件系统要求inode是唯一的,因此硬链接不能跨文件系统

1.5.6 企业面试题11


spacer.gif

1.6 Linux文件属性*——文件删除的原理

1.6.1 Linux下文件删除的原理

spacer.gif

其中,i_link(硬链接数量),包括硬链接文件和文件本身

1.6.2 企业案例2-Linux下文件删除

spacer.gif

模拟场景:

spacer.gif

[root@oldboy /]# yum install httpd -y

此处省略

Complete!

[root@oldboy /]# /etc/init.d/httpd start

Starting httpd: httpd: apr_sockaddr_info_get()failed for oldboy

httpd: Could not reliably determine the server'sfully qualified domain name, using 127.0.0.1 for ServerName

                                                          [  OK  ]

[root@oldboy /]# lsof -i :80            【查看80端口是否被httpd利用了,有记录就对了】

COMMAND PID   USER   FD  TYPE DEVICE SIZE/OFF NODE NAME

httpd  5660   root    4u IPv6  18037      0t0 TCP *:http (LISTEN)

[root@oldboy /]# /etc/init.d/iptables stop

[root@oldboy /]# cd /etc/httpd/conf

[root@oldboy conf]#vi httpd.conf

1008 #   CustomLog logs/dummy-host.example.com-access_log common

[root@oldboy conf]# grep "#    CustomLoglogs/dummy-host.example.com-access_log common" httpd.conf

#   CustomLog logs/dummy-host.example.com-access_log common

[root@oldboy conf]# sed -i 's@#   CustomLoglogs/dummy-host.example.com-access_log common@    CustomLog /app/logs/dummy-host.example.com-access_logcommon@g' httpd.conf

[root@oldboy conf]# grep "#    CustomLoglogs/dummy-host.example.com-access_log common" httpd.conf

[root@oldboy conf]# grep "    CustomLog/app/logs/dummy-host.example.com-access_log common" httpd.conf

CustomLog/app/logs/dummy-host.example.com-access_log common

(2)创建一个小的文件系统,用于存放上述日志

dd if=/dev/zero of=/dev/sdc bs=8K count=10

ls –l /dev/sdc

tune2fs –c –l /dev/sdc

mkdir /app/logs -p

mount –o loop /dev/sdc /app/logs

(3)重启httpd服务,确保日志记录到了上述文件系统挂载的/app/log下面

/etc/init.d/httpd restart

(4) 写个循环脚本访问httpd,使得httpd日志充满/app/log整个空间

开始解决磁盘满的问题:

(1)   尝试删除访问日志:rm –f access_log(2)然后df –h发现删除后,空间还是显示99%。说明删除文件,单单让i_link=0是不够的,还需要让i_count=0,因此需要重启服务释放进程,即/etc/init.d/httpd restart。

查看被删除的但仍由进程占用的文件名:lsof  | grep del


1.6.3 企业案例3

spacer.gif

spacer.gif

1.7 Linux文件属性——用户和组基础知识介绍

1.7.1 Linux系统中用户角色划分

spacer.gif


1.7.2 超级用户

spacer.gif

spacer.gif

1.7.3 普通用户:

spacer.gif

1.7.4 虚拟用户:

spacer.gif

spacer.gif

1.7.5 查看用户UIDGID,以及区分特殊用户、普通用户、超级用户的方法

spacer.gif

查看用户UID和GID,以及区分特殊用户、普通用户、超级用户的方法:

[root@oldboy ~]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

此处省略……

ntp:x:38:38::/etc/ntp:/sbin/nologin

saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

oldgirl:x:500:500::/home/oldgirl:/bin/bash

apache:x:48:48:Apache:/var/www:/sbin/nologin

【从上列可以知道,以nologin(无法登陆)结尾的,都为特殊用户;以bash结尾的,除了UID和GID都为0的root用户之外,均为普通用户;在清楚系统哪个服务不需要的情况下,可以通过注释某些用户,提高系统安全性】

1.7.6 用户组

spacer.gif

spacer.gif

即使没有给用户分配组,每个用户都有一个默认的所属用户组,那个默认的用户组就是用户自己本身,只是默认的用户组不显示出来而已。平时可以用id命令查看,如:

[root@oldboy ~]# id oldboy

uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)

[root@oldboy ~]# useradd kkk

[root@oldboy ~]# tail -1 /etc/passwd

[root@oldboy ~]# kkk:x:501:501::/home/kkk:/bin/bash

[root@oldboy ~]# id kkk

uid=501(kkk) gid=501(kkk) groups=501(kkk)

1.7.7 用户及用户组配置文件介绍

spacer.gif

1)与用户相关的配置文件有:                      2)与用户组相关的配置文件有:

/etc/passwd    #用户的配置文件                                 /etc/group     #用户组的配置文件

/etc/shadow    #用户影子口令文件                             /etc/gshadow       #用户组影子口令文件

 

实例1-1 

[root@oldboy ~]# useradd test

[root@oldboy ~]# tail -1 /etc/passwd

test:x:501:501::/home/test:/bin/bash

[root@oldboy ~]# tail -1 /etc/shadow

test:!!:17108:0:99999:7:::

[root@oldboy ~]# tail -1 /etc/group

test:x:501:

[root@oldboy ~]# tail -1 /etc/gshadow

test:!::

1.7.7.2 与用户相关的配置文件——/etc/passwd【重要】

[root@oldboy ~]# useradd test

[root@oldboy ~]# tail -1 /etc/passwd

test:x:501:501::/home/test:/bin/bash

spacer.gif

spacer.gif

spacer.gif

spacer.gif

spacer.gif

查看登陆的解释器:

[root@oldboy ~]# cat /etc/shells 【×××为常用解释器】

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

[root@oldboy ~]# echo $SHELL 【查看shell编辑器的对于路径】

/bin/bash

1.7.7.3 与用户相关的配置文件——/etc/shadow【了解】

[root@oldboy ~]# useradd test

[root@oldboy ~]# tail -1 /etc/shadow

test:!!:17108:0:99999:7:::

spacer.gif

1.7.7.4 与用户相关的配置文件——小结


1.7.7.5 与用户组相关的配置文件——/etc/group【了解】

[root@oldboy ~]# useradd test

[root@oldboy ~]# tail -1 /etc/group

test:x:501:

[root@oldboy ~]# tail -1 /etc/gshadow

test:!::

spacer.gif

spacer.gif

1.7.7.6 与用户组相关的配置文件——/etc/gshadow【了解】

1.8 Linux文件属性——时间戳及文件名属性知识讲解:

1.8.1 Linux文件属性——时间戳

格式化显示时间属性:

[root@oldboy ~]# ll /oldboy

total 12

-rw-r--r--. 1 root root    0 Dec 25 2016 1.txt

-rw-r--r--. 1 root root    0 Dec 25 2016 2.txt

-rw-r--r--. 1 root root    0 Dec 25 2016 3.txt

[root@oldboy ~]# ls -l --time-style=long-iso /oldboy 【格式化显示时间属性】

total 12

-rw-r--r--. 1 root root    0 2016-12-25 03:361.txt

-rw-r--r--. 1 root root    0 2016-12-25 03:362.txt

-rw-r--r--. 1 root root    0 2016-12-25 03:363.txt

 

查看文件的时间属性:

[root@oldboy ~]# stat /oldboy

  File:`/oldboy'

  Size:4096        Blocks: 8          IO Block:4096   directory

Device: 803h/2051d  Inode:390256      Links: 3

Access: (0755/drwxr-xr-x)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-12-2503:36:20.323987452 +0800

Modify: 2016-12-2503:36:18.342985924 +0800

Change: 2016-12-2503:36:18.342985924 +0800

1.8.2 Linux文件属性——文件名属性

文件名,不在文件的inode里,而在上级目录的block

遇到复杂的文件名,无法还原删除的时候,可以用tab键让它自动补全

第2章 Linux通配符-正则表达式原理及深度实践精讲

2.1 Linux通配符和三剑客正则表达式的区别

spacer.gif

spacer.gif


2.1.1 *号举例

spacer.gif

2.1.2 ?号举例


2.1.3 ;号举例

spacer.gif

2.1.4 #号举例

注释

2.1.5 |号举例

| 管道的效率其实不高

2.1.6 ‘’单引号举例

所见即所得

spacer.gif

原本date是命令,不加单引号的话,输出应该是日期,但是加了单引号就输出了本身,所以所见即所得。而且哪怕加上反引号(用于解析命令),只要加上单引号,输出一样是所见即所得,即`date`

2.1.7 “”双引号举例

1、双引号有变量置换的功能,会把变量进行解析,再输出结果

但是下面有一种情况,是不会解析成功的(如图),那是因为date不是变量,是命令;

spacer.gif

2、如果要解析命令,要另外加反引号,就能解析成功(如图)`

spacer.gif

或者把命令变成变量

spacer.gif

3、在默认不加引号的情况下,效果等同于加双引号

spacer.gif

2.1.8 单、双引号的区别举例

spacer.gif

spacer.gif

2.1.9 {}大括号举例

spacer.gif

spacer.gif


spacer.gif

2.2 Linux正则表达式基础

spacer.gif

 

2.2.1 正则表达式第一波:

spacer.gif

2.2.2 正则表达式第二波:

spacer.gif

 

 

实例2-1 

. .* 的区别

spacer.gif

grep –n,显示行号

sed –n,取消默认输出

 

实例2-2 

因为. 区分大小写,所以需要加上grep - i才能不分大小写

spacer.gif

 

 

 

实例2-3 

转义字符\的作用,以后grep –o的作用

grep–o:表示只打印筛选出来的字符

spacer.gif

扩展:其中,点除了正则表达式中的作用,还有很多用法:

spacer.gif

实例2-4 

*的作用,重复0个或多个前面的一个字符,

例如o*匹配没有o,有一个o或多个oooooo

spacer.gif

例如0*

spacer.gif

2.2.3 正则表达式第三波:

spacer.gif

实例2-5 

spacer.gif



实例2-6 

spacer.gif


实例2-7 

注意:egrep(grep –E)sed –r过滤一般特殊字符可以不转义,即不需要加斜线


2.3 Linux正则表达式基础小结

spacer.gif

spacer.gif

spacer.gif

2.4 Linux三剑客之grep常用参数详细总结

spacer.gif

2.5 正则表达式扩展部分:egrepgrep -E

spacer.gif

其中只有(.)是代表当前字符;(+、?、*)都是代表前面的字符

2.5.1 egrep “+”

spacer.gif

2.5.1.1 取出########1@@@@@@@2******中的数字12

[root@show ~]# echo "########1@@@@@@@2******"

########1@@@@@@@2******

[root@show ~]# echo"########1@@@@@@@2******"|egrep "[#@*]"

########1@@@@@@@2******

[root@show ~]# echo"########1@@@@@@@2******"|egrep -o "[#@*]"

#

#

#

#

#

#

#

#

@

@

@

@

@

@

@

*

*

*

*

*

*

[root@show ~]# echo"########1@@@@@@@2******"|egrep "[#@*]+"

########1@@@@@@@2******

[root@show ~]# echo"########1@@@@@@@2******"|egrep -o "[#@*]+"

########

@@@@@@@

******

[root@show ~]# echo"#####@@@@**###1@@@@@@##@##@@2**####****"|egrep  "[#@*]+"

#####@@@@**###1@@@@@@##@##@@2**####****

[root@show ~]# echo"#####@@@@**###1@@@@@@##@##@@2**####****"|egrep -o "[#@*]+"

#####@@@@**###

@@@@@@##@##@@

**####****

[root@show ~]# #[] 表示一个整体,相当于一个字符

[root@show ~]# #[#*!@#!@#!@#]  这个字符 有很多种可能  # ! @ 这几个字符中的任何一个

[root@show ~]# #重复====连续

[root@show ~]# #扩展正则表达式  +  ,重复前一个(一个整体)字符一次或一次以上

[root@show ~]# echo"#####@@@@**###1@@@@@@##@##@@2**####****"|awk -F"[#@*]"  '{print $2}' 【错误】

[root@show ~]# echo"#####@@@@**###1@@@@@@##@##@@2**####****"|awk -F"[#@*]+"  '{print $2}' 【正确】

1

[root@show ~]# echo"#####@@@@**###1@@@@@@##@##@@2**####****"|awk -F"[#@*]+"  '{print $3}' 【正确】

2

2.5.2 egrep “?”

spacer.gif

2.5.3 egrep “|”


2.5.4 egrep “()”


2.5.5 正则表达式的拓展的小结

spacer.gif

5)元字符

spacer.gif

2.6 linux正则表达式结合三剑客企业级深度实践案例

2.6.1 取系统IP

 [root@oldboy~]# ifconfig eth0

eth0     Link encap:Ethernet  HWaddr00:0C:29:6B:44:3D 

         inet addr:192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fe6b:443d/64 Scope:Link

          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1

          RX packets:332 errors:0 dropped:0overruns:0 frame:0

          TXpackets:176 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:1000

          RXbytes:45258 (44.1 KiB)  TX bytes:24366(23.7 KiB)

 

方法一:

sed -ns#支持正则位置##gpfile     只有前面两个分隔符之间支持正则;-n取消默认输出;p打印

[root@oldboy ~]# ifconfig eth0|sed -n '2p'  【-n,取消默认输出;2p,打印出第二行

         inet addr:192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

[root@oldboy ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'【清空以任意字符开头dr:结尾的内容,之所以选dr:,是因为这个在目标内容里是唯一,否则会自动匹配最远的一个

192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

[root@oldboy ~]# ifconfig eth0|sed -n '2p'|sed's#^.*dr:##g'|sed's#B.*$##g'清空以B开头任意字符结尾的内容

192.1.10.128 【注意此处结果的结尾有两个空格

[root@oldboy ~]# ifconfig eth0|sed -n '2p'|sed's#^.*dr:##g'|sed 's#  B.*$##g'清空以两个空格+B开头任意字符结尾的内容

192.1.10.128【注意此处结果的结尾没有两个空格,完美

方法二:

sed –n ‘s#支持正则位置##gp’file 注意,-np是一般是一起用的,即取消默认输出,然后打印

sed –n ‘2s#支持正则位置##gp’file指定行号:s前的2为行号

[root@oldboy ~]# ifconfig eth0|sed -n'2s#^.*dr:##gp'|sed 's#  B.*$##g'

192.1.10.128

方法三:

sed的反向引用:sed –nr ‘s#()()#\1\2#gp’ file   注意用反向引用,一定要加-r,才能过滤一般字符

当在前面匹配部分用小括号的时候,第一个括号内容,可以在后面部分用\1输出。

同理,第二个括号的内容,可以在后面部分用\2输出。

[root@oldboy ~]# ifconfig eth0|sed -nr '2s#^.*dr:(.*)B.*$#\1#gp' 【注意此处B前面有个空格

192.1.10.128

方法四:

awk搭配扩展正则表达式+

[root@oldboy ~]# ifconfigeth0|awk -F "[ :]+" 'NR==2{print $4}' 【注意,此处:前面有空格,还有之所以是$4不是$3,是因为如果开头是连续空格,默认第一个空格就是$1

192.1.10.128

2.6.2 /etc/passwd文件中第一列和最后一列的数据调换。(同:第一节的课后考试题第八题)

第一种方法:用sed命令

[root@oldboy ~]# sed -n '1p' /etc/passwd    【首先显示第一行的命令】

root:x:0:0:root:/root:/bin/bash

[root@oldboy ~]# sed -nr'1s#([^:]+)(:.*:)(/.*$)#\1\2\3#gp' /etc/passwd 【用sed正则把第一行表示出来,其中[^:]+的意思是:把[]括号里一个或一个以上以非:开头的多个字符,组成一个字符】

root:x:0:0:root:/root:/bin/bash

[root@oldboy ~]# sed -nr'1s#([^:])(:.*:)(/.*$)#\3\2\1#gp' /etc/passwd 【错误示范,不加+的结果】

roo/bin/bash:x:0:0:root:/root:t

[root@oldboy ~]# sed -nr'1s#([^:]+)(:.*:)(/.*$)#\3\2\1#gp' /etc/passwd 【正确示范,加+,用sed正则把第一行的第一列和最后一列对调】

/bin/bash:x:0:0:root:/root:root

[root@oldboy ~]# sed -nr's#([^:]+)(:.*:)(/.*$)#\3\2\1#gp' /etc/passwd  【取消s前的1,用sed正则把所有行的第一列和最后一列对调,完成题目】

/bin/bash:x:0:0:root:/root:root

此处省略……

/bin/bash:x:501:501::/home/test:test

第二种方法:用awk命令

[root@oldboy ~]# awk -F ":" 'NR==1{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

[root@oldboy ~]# awk -F ":" 'NR==1{print $1,$7}' /etc/passwd

root /bin/bash

[root@oldboy ~]# awk -F ":" 'NR==1{print $7,$1}' /etc/passwd

/bin/bash root

[root@oldboy ~]# awk -F ":" 'NR==1{print $7,$2,$3,$4,$5,$6,$1}' /etc/passwd

/bin/bash x 0 0 root /root root

[root@oldboy ~]# awk -F ":" 'NR==1{print$7":"$2":"$3":"$4":"$5":"$6":"$1}'/etc/passwd

/bin/bash:x:0:0:root:/root:root

[root@oldboy ~]# awk -F ":" '{print$7":"$2":"$3":"$4":"$5":"$6":"$1}'/etc/passwd

/bin/bash:x:0:0:root:/root:root

此处省略……

/bin/bash:x:501:501::/home/test:test

第3章 Linux第三关命令详解*及三剑客sed命令

3.1课前考试题1

spacer.gif

spacer.gif

3.1.1模拟环境:

[root@oldboy ~]# touch /etiantian

[root@oldboy ~]# ls -l /etiantian

-rw-r--r-- 1 root root 0 Nov  6 10:24 /etiantian

3.1.2方法一:ls+cut+tr+awk

[root@oldboy ~]# ls -l /etiantian|cut –c 2-10

rw-r--r--

[root@oldboy ~]# ls -l /etiantian|cut –c 2-10|tr"rwx-" "4210"

420400400

[root@oldboy ~]# ls -l /etiantian|cut –c 2-10|tr"rwx-" "4210"|awk -F "" '{print $1+$2+$3}'

6

[root@oldboy ~]# ls -l /etiantian|cut –c 2-10|tr"rwx-" "4210"|awk -F "" '{print$1+$2+$3,$4+$5+$6,$7+$8+$9}'

6 4 4

[root@oldboy ~]# ls -l /etiantian|cut –c 2-10|tr"rwx-" "4210"|awk -F "" '{print$1+$2+$3""$4+$5+$6""$7+$8+$9}'

644

3.1.3方法二:stat+sed正则

[root@oldboy ~]# stat /etiantian

  File:`/etiantian'

  Size:0           Blocks: 0          IO Block: 4096   regular empty file

Device: 803h/2051d  Inode:20945       Links: 1

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-11-06 10:24:03.802331024 +0800

Modify: 2016-11-06 10:24:03.802331024 +0800

Change: 2016-11-06 10:24:03.802331024 +0800

[root@oldboy ~]# stat /etiantian|sed -nr'4s#^.*\(0##gp'|sed -n 's#/-.*$##gp'

644

3.1.4方法三:stat+sed正则后向引用

[root@oldboy ~]# stat /etiantian|sed -nr's#^.*\(0(.*)/-.*$#\1#gp'

644

3.1.5方法四:stat+awk

[root@oldboy ~]# stat /etiantian|awk -F "[:(/]+" 'NR==4 {print $2}'

0644    

[root@oldboy ~]# stat /etiantian|awk-F "[0/]+" 'NR==4 {print $2}'

644

3.1.6方法五:stat+sed+cut

[root@oldboy ~]# stat /etiantian|sed -n '4p'|cut-b 11-13

644

3.1.7方法六:用man命令查询stat的参数

[root@oldboy ~]# stat -c %a /etiantian

644

3.2课前考试题2


解答:两个,本身和目录下的点.

3.3课前考试题3

获取IP

[root@oldboy ~]# ifconfig eth0

eth0     Link encap:Ethernet  HWaddr00:0C:29:6B:44:3D 

         inet addr:192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fe6b:443d/64 Scope:Link

          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1

          RXpackets:8124 errors:0 dropped:0 overruns:0 frame:0

          TXpackets:2496 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RXbytes:630101 (615.3 KiB)  TX bytes:266712(260.4 KiB)

3.3.1方法1awk

[root@oldboy ~]# ifconfig eth0|awk -F "[:]+" 'NR==2 {print $4}'

192.1.10.128

3.3.2方法2sed,在知道行号的情况下

[root@oldboy ~]# ifconfig eth0|sed -nr '2s#^.*dr:(.*)  B.*$#\1#gp'

192.1.10.128

3.3.3方法2sed,在不知道行号的情况下,用过滤的方法过滤出行,再筛选获取IP

[root@oldboy ~]# ifconfig eth0|sed -nr '/inet/p'

         inet addr:192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fe6b:443d/64 Scope:Link

[root@oldboy ~]# ifconfig eth0|sed -nr '/inet addr:/p'

         inet addr:192.1.10.128 Bcast:192.1.10.255 Mask:255.255.255.0

[root@oldboy ~]# ifconfig eth0|sed -nr '/inet addr:/ s#^.*dr:(.*)  B.*$#\1#gp'

192.1.10.128

3.4课前考试题4


eth0 /etc/sysconfig/network-scripts/ifcfg-eth0

客户端DNS/etc/resolv.conf

3.5课前考试题5*

spacer.gif

3.5.1模拟环境

[root@oldboy ~]# cd /test

[root@oldboy test]# echo  www.etiantian.org > a.txt

[root@oldboy test]# echo  www.etiantian.org > b.txt

[root@oldboy test]# echo  www.etiantian.org > c.txt

[root@oldboy test]# echo  www.etiantian.org > d.txt

[root@oldboy test]# echo  www.etiantian.org > e.txt

[root@oldboy test]# find . -type f |xargs cat

www.etiantian.org

www.etiantian.org

1

www.etiantian.org

www.etiantian.org

www.etiantian.org

3.5.2解答

[root@oldboy test]# find . -type f |xargs sed's#www.etiantian.org#www.oldboy.com#g'

www.oldboy.com

www.oldboy.com

1

www.oldboy.com

www.oldboy.com

www.oldboy.com

[root@oldboy test]# find . -type f |xargs sed -i's#www.etiantian.org#www.oldboy.com#g'【如果是重要的文件,可以考虑用-i.bak,备份一下。如果文件很多,这样就很大了。所以还是建议对上一级目录做完整备份】

[root@oldboy test]# find . -type f |xargs cat

www.oldboy.com

www.oldboy.com

1

www.oldboy.com

www.oldboy.com

www.oldboy.com

3.6企业案例4

spacer.gif

spacer.gif

spacer.gif

spacer.gif

spacer.gif

spacer.gif

spacer.gif

3.7课前考试题6


解答:后面讲

3.8课前考试题7

spacer.gif

解答:后面讲

3.9课前考试题8

spacer.gif

3.9.1解答:

[root@oldboy test]# echo "oldboy"; echo"oldboy"

oldboy

oldboy

[root@oldboy test]# echo -n "oldboy";echo "oldboy"

oldboyoldboy

[root@oldboy test]# echo -ne "oldboy\t";echo "oldboy"【\t:t知的是tab键,\是转义;一定要配合-e用】

oldboy  oldboy【刚好相距一个tab键】

\n   回车键盘

\t    tab

spacer.gif

spacer.gif

 

3.10课前考试题9

spacer.gif

注意:现在虚拟机的时间跟不上现实时间,是正常的。到其中架构的时候,会讲优化服务器时间

3.10.1解答

[root@oldboy test]# date

Sun Nov  616:52:31 CST 2016

[root@oldboy test]# date -s "2016/11/616:55" 【date -s,修改时间】

Sun Nov  616:55:00 CST 2016

[root@oldboy test]# date

Sun Nov  616:55:03 CST 2016

[root@oldboy test]# date +%y-%m-%d 【把时间按指定格式输出,例如+%y-%m-%d,年-月-容】

16-11-06

[root@oldboy test]# date +%Y-%m-%d 【看四位数年份,用大+%Y】

2016-11-06

[root@oldboy test]# date +%F 【命令太长不方便,用大+&F,代表+%y+%m+%d】

2016-11-06

[root@oldboy test]# date +%w 【显示今天周几,用+%w】

0

3.10.2date命令


spacer.gif

画红线的一定要记住!

[root@oldboy test]# date +%X

05:06:07 PM

[root@oldboy test]#

[root@oldboy test]# date +%X 【+%X,代表+%H+%M+%S】

17:06:19

[root@oldboy test]# date +%H:%M:%S 【小时:分:秒】

17:06:58

[root@oldboy test]# date +%F\%X

2016-11-0617:19:13
[root@oldboy test]# date +%F\ %X

2016-11-06 17:19:05

 

spacer.gif

 

3、时间加减

[root@oldboy ~]# date +%F -d "-1day" 【昨天】

2016-11-05

[root@oldboy ~]# date +%F -d "-2day" 【前天】

2016-11-04

[root@oldboy ~]# date +%F -d "+1day" 【明天】

2016-11-07

[root@oldboy ~]# date +%F-%H -d "+24Hour"【24小时以后】

2016-11-07-19

3.10.3date命令+tar(打包)命令

[root@oldboy ~]# tar zcvf test.tar.gz ./test/打包./test/目录下的文件,命名为test.tar.gz;其中需要注意的是,在哪里执行打包命令,打包后的文件就会并存放在哪里

./test/a.txt

./test/b.txt

./test/c.txt

./test/oldboy.txt

[root@oldboy ~]# ls

-help anaconda-ks.cfg  install.log  install.log.syslog  test  test.tar.gz

[root@oldboy ~]# tar zcvf test_`date +%F`.tar.gz ./test/ 【按当前日期来打包文件的方法1】

[root@oldboy ~]# tar zcvf test_$(date +%F).tar.gz ./test/ 【按当前日期来打包文件的方法2】

./test/a.txt

./test/b.txt

./test/c.txt

./test/oldboy.txt

[root@oldboy ~]# ls

-help anaconda-ks.cfg  install.log  install.log.syslog  test  test.tar.gz  test_2016-11-06.tar.gz

[root@oldboy ~]# tar zcvf test_$(date +%F -d "-1day").tar.gz./test/ 【按前一天的日期来打包文件】

./test/a.txt

./test/b.txt

./test/c.txt

./test/oldboy.txt

阿里云时间:

ntpdate ntp1.aliyun.com

3.11课前考试题10

spacer.gif

spacer.gif

spacer.gif

这里由于已经是centos6,因此不以上面的题目为例了。以下列的为例:

3.11.1环境变量$PATH

[root@oldboy ~]# echo oldgirl > oldboy

[root@oldboy ~]# ls

-help           install.log         oldboy  test.tar.gz             test_2016-11-06.tar.gz

anaconda-ks.cfg install.log.syslog  test    test_2016-11-05.tar.gz

[root@oldboy ~]# oldboy

-bash: oldboy: command not found

[root@oldboy ~]# echo $PATH 【所有命令的路径所在地,用冒号分隔】

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@oldboy ~]# PATH="$PATH:/root" 【这里注意的是,在添加新命令所在的路径,到环境变量$PATH里面的时候,一定要加$PATH本身,否则系统所有的命令都会被清空了】

[root@oldboy ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root 【添加成功】

[root@oldboy ~]# oldboy 【命令生效】

oldgirl

说明:

1、所有命令的路径,都存在当前用户的系统全局环境变量$PATH里面,如果某个命令的所在路径,不在全局变量里面,那么这个命令将无法执行。

2which命令查找命令所在路径的时候,也是查找全局环境变量$PATH里的路径的。

3.12课前考试题11

spacer.gif

spacer.gif

3.12.1模拟环境:

[root@oldboy ~]# cat >/oldboy/test.txt<<EOF

oldboy

 

xizi

 

xiaochao

EOF

[root@oldboy ~]# cat /oldboy/test.txt

oldboy

 

xizi

 

xiaochao

3.12.2方法一:grep

[root@oldboy ~]# grep -v "^$" /oldboy/test.txt【-v,排除;^$,表示空行】

oldboy

xizi

xiaochao

[root@oldboy ~]#

3.12.3方法二:sed

[root@oldboy ~]# sed '/^$/d' /test.txt 【过滤出空行并删除;d是delete的意思;也可以加-i,保存修改,即删除内容的空行】

oldboy

xizi

xiaochao

3.12.4方法三:awk

[root@oldboy ~]# awk /^[^$]/ /test.txt 【^[^$]表示匹配非空行的开头,过滤出以非空行开头的行】

oldboy

xizi

xiaochao

3.13课前考试题12

spacer.gif

spacer.gif

spacer.gif

3.14课前考试题13

spacer.gif

spacer.gif

3.15课前考试题14


spacer.gif

spacer.gif

spacer.gif

由于Find查命令是从根目录开始查的,所以效率最低,这里就不列出来了

3.16课前考试题15


解答:先自己做后面讲

3.17课前考试题16

spacer.gif

解答:先自己做后面讲

 

3.18课前考试题17

spacer.gif

解答:先自己做后面讲

 

3.19课前考试题18

spacer.gif

3.19.1关机:

spacer.gif 

spacer.gif

3.19.2重启:

spacer.gif

3.19.3注销:

spacer.gif

3.20课前考试题19

spacer.gif



 

3.21三剑客之sed深度实践讲解*

3.21.1功能说明

spacer.gif

3.21.2语法格式

spacer.gif

3.21.3命令执行流程

spacer.gif


 


3.21.4使用范例

spacer.gif

3.21.5增删改查*

3.21.5.1 增——单行增加

1、a,追加文本到指定行后

2、i,插入文本到指定行前

这里ai的功能,在vi或者vim编辑器里,也是一样的

其中在在vi或者vim编辑器里,i是默认在行尾插入光标,I是默认在行首插入光标

[root@oldboy oldboy]# sed '2a 106,dandan,CSO' person.txt 【如果有需要,可以加-i保存修改】

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy oldboy]# sed '2i 106,dandan.CSO' person.txt

101,oldboy,CEO

106,dandan.CSO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3.21.5.2 增——多行增加

[root@oldboy oldboy]# sed '2a 106,dandan,CSO\n107,bingbing,CCO'person.txt 【利用\n,回行】

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3.21.5.3 企业案例5

spacer.gif

spacer.gif

spacer.gif

3.21.5.4 

d,指定行删除

[root@oldboy oldboy]# sed '1~2d' person.txt 【删除奇数行】

102,zhangyao,CTO

104,yy,CFO

[root@oldboy oldboy]# sed '1,2d' person.txt 【删1到2行】

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy oldboy]# sed '1,+2d' person.txt 【删1到3行】

104,yy,CFO

105,feixue,CIO

[root@oldboy oldboy]# sed '2d' person.txt 【删第2行】

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@oldboy oldboy]# sed '/feixue/,2d' person.txt【删除包含feixue字段到第2行的行,但如果第2行前找不到包含feixue字段的行,则会自动搜索第2行之后的包含feixue字段的行,并删除】

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

3.21.5.5 企业案例6

spacer.gif


3.21.5.6 改——按行替换

c,用新行替代旧行

spacer.gif

3.21.5.7 改——文本替换

 

spacer.gif

spacer.gif

3.21.5.8 企业案例7


spacer.gif

 

3.21.5.9 改——变量替换



复习:

单引号的作用,所见即所得;双引号的作用,可以置换变量;无引号,相当于双引号

eval命令,也可以置换变量,哪怕有单引号

3.21.5.10           改——分组替换\(  \)\1的使用说明


spacer.gif

3.21.5.11           企业案例7

spacer.gif

3.21.5.12           改——特殊符号&代表被替换的内容

spacer.gif

3.21.5.13           企业案例8:批量重命名文件

spacer.gif

解答:

[root@oldboy ~]# cd test

[root@oldboy test]# pwd

/root/test

[root@oldboy test]# touchstu_102999_{1..5}_finished.jpg

[root@oldboy test]# ls

a.txt c.txt  e.txt       stu_102999_1_finished.jpg  stu_102999_3_finished.jpg  stu_102999_5_finished.jpg

b.txt d.txt  oldboy.txt  stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

[root@oldboy test]# ls *jpg|sed -r 's#(^.*)_finished.jpg#mv & \1.jpg#g'

mv stu_102999_1_finished.jpg stu_102999_1.jpg

mv stu_102999_2_finished.jpg stu_102999_2.jpg

mv stu_102999_3_finished.jpg stu_102999_3.jpg

mv stu_102999_4_finished.jpg stu_102999_4.jpg

mv stu_102999_5_finished.jpg stu_102999_5.jpg

[root@oldboy test]# ls *jpg|sed -r's#(^.*)_finished.jpg#mv & \1.jpg#g'|bash 【bash执行命令】

[root@oldboy test]# ls *jpg

stu_102999_1.jpg stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

3.21.5.14           

p,输出指定内容,但默认会输出2次匹配的结果,因此使用-n取消默认输出;所以-np一般都会搭配来使用

spacer.gif



第4章 Linux基础命令集中深入讲解第三部分

4.1ln命令

spacer.gif

4.1.1ln,创建硬链接

spacer.gif

注意:以上两个文件目录虽然是一样的inode值,但是他们不是同一个文件目录,也不是互为硬链接,因为他们不是在同一个存储介质上。/proc是在内存上的。

4.1.2ln -s,创建软链接

4.2readlink命令

spacer.gif

由于查询软链接的源文件,不能查询硬链接的源文件

4.3rename命令

4.3.1重命名的方法1mv

spacer.gif

4.3.2重命名的方法2rename


spacer.gif

4.4basename dirname命令

用武之地:

spacer.gif

4.4.1basename,只获取路径后的文件名,或者只获取文件名(不要后缀)


4.4.2dirname,只获取文件的路径

spacer.gif

4.5file命令

用于查看文件类型

spacer.gif

4.6md5sum命令,计算和校验文件的md5

每个文件都只有唯一一个md5值,就像文件的指纹一样

所以硬链接和软链接和源文件,他们的md5值的一样的

如下图

spacer.gif

4.6.1校验的方法,-c check

spacer.gif


一般用于校验文件的完整性。

例如网上下载一个镜像文件,人家网站总是会提供一个md5值校验码,用于提供下载完成后的自我校验。如果下载后的文件的校验码一样,说明下载没问题;如果校验码不同,说明下载的文件不完整,这样是会安装失败的。