课程笔记 第三周 |
作者:梅珈玮 归档:学习笔记 2016/10/31
|
快捷键: Ctrl + 1 标题1 Ctrl + 2 标题2 Ctrl + 3 标题3 Ctrl + 4 实例 Ctrl + 5 程序代码 Ctrl + 6 正文 |
格式说明: 蓝色字体:注释 ×××背景:重要 绿色背景:注意 |
老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结
学无止境,老男孩教育成就你人生的起点!
联系方式:
网站运维QQ交流群: | |
Linux 385168604 | 架构师 390642196 |
Python 29215534 | 大数据 421358633 |
官方网站: | |
目 录
第1章 Linux文件属性体系知识超细精讲... 1
1.1 linux文件属性描述... 1
1.2 Linux文件属性——索引节点inode深度讲解,及扩展文件数据block. 2
1.2.1 Inode(文件属性)和block(文件内容)的关系... 2
1.2.2 查看系统容量:stat、dumpe2fs、df. 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 查看用户UID和GID,以及区分特殊用户、普通用户、超级用户的方法... 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 正则表达式扩展部分:egrep或grep -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
扩展:查看文件或目录大小,还可用du –sh;而且细心发现,一个目录的大小是一个block的大小4.0K
1.2 Linux文件属性*——索引节点inode深度讲解,及扩展文件数据block
1.2.1 Inode(文件属性)和block(文件内容)的关系
举个例子:
1.2.2 查看系统容量:stat、dumpe2fs、df
[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
[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的小结
[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的数量
1.2.5 有关block的小结
1.2.6 总的小结
1)、磁盘分区被格式化文件系统后,会分为inode和block
1.2.7 企业面试题
1.2.8 企业案例1
1.3 Linux文件属性——文件类型知识深度讲解
1.3.1 普通文件:- (regular file)
1.3.2 目录文件:d (directory)
ls -F /etc/ | grep "/$",表示筛选出以/结尾的文件,就是目录;
ls -l /etc/ |grep "^d" ,表示筛选出以d开头的文件,就是目录
1.3.3 字符设备或块设备文件:b (block)
1.3.4 Linux文件后缀名
1.4 Linux文件属性——文件权限基础介绍
1.5 Linux文件属性——软硬链接知识深度讲解
1.5.1 ln命令
ln [源文件] [目标硬链接]
ln –s [源文件] [目标软链接]
1.5.2 硬链接(相当于block的多个入口)
[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 软链接(相当于快捷方式)
[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属性】
删除源文件,链接文件还存在,但是就显示找不到源文件,显示样式如下:
其中!ln,表示执行最近的一次ln命令
1.5.4 有关文件的硬链接与软链接的区别
1.5.5 有关目录的硬链接与软链接的区别
由上图可知,本身当前目录是一个,当前目录的点是一个,下级目录的点点是一个,所以一共3个。而且inode相同,说明是同一个目录,互为硬链接。由于硬链接文件和源文件的inode是相同的,而文件系统要求inode是唯一的,因此硬链接不能跨文件系统
1.5.6 企业面试题11
1.6 Linux文件属性*——文件删除的原理
1.6.1 Linux下文件删除的原理
其中,i_link(硬链接数量),包括硬链接文件和文件本身
1.6.2 企业案例2-Linux下文件删除
模拟场景:
[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
1.7 Linux文件属性——用户和组基础知识介绍
1.7.1 Linux系统中用户角色划分
1.7.2 超级用户
1.7.3 普通用户:
1.7.4 虚拟用户:
1.7.5 查看用户UID和GID,以及区分特殊用户、普通用户、超级用户的方法
查看用户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 用户组
即使没有给用户分配组,每个用户都有一个默认的所属用户组,那个默认的用户组就是用户自己本身,只是默认的用户组不显示出来而已。平时可以用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 用户及用户组配置文件介绍
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
查看登陆的解释器:
[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:::
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:!::
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通配符和三剑客正则表达式的区别
2.1.1 *号举例
2.1.2 ?号举例
2.1.3 ;号举例
2.1.4 #号举例
注释
2.1.5 |号举例
| 管道的效率其实不高
2.1.6 ‘’单引号举例
所见即所得
原本date是命令,不加单引号的话,输出应该是日期,但是加了单引号就输出了本身,所以所见即所得。而且哪怕加上反引号(用于解析命令),只要加上单引号,输出一样是所见即所得,即`date`
2.1.7 “”双引号举例
1、双引号有变量置换的功能,会把变量进行解析,再输出结果
但是下面有一种情况,是不会解析成功的(如图),那是因为date不是变量,是命令;
2、如果要解析命令,要另外加反引号,就能解析成功(如图)`
或者把命令变成变量
3、在默认不加引号的情况下,效果等同于加双引号
2.1.8 单、双引号的区别举例
2.1.9 {}大括号举例
2.2 Linux正则表达式基础
2.2.1 正则表达式第一波:
2.2.2 正则表达式第二波:
实例2-1
. 和 .* 的区别
grep –n,显示行号
sed –n,取消默认输出
实例2-2
因为. 区分大小写,所以需要加上grep - i才能不分大小写
实例2-3
转义字符\的作用,以后grep –o的作用
grep–o:表示只打印筛选出来的字符
扩展:其中,点除了正则表达式中的作用,还有很多用法:
实例2-4
*的作用,重复0个或多个前面的一个字符,
例如o*匹配没有o,有一个o或多个oooooo
例如0*
2.2.3 正则表达式第三波:
实例2-5
实例2-6
实例2-7
注意:egrep(grep –E)或sed –r过滤一般特殊字符可以不转义,即不需要加斜线
2.3 Linux正则表达式基础小结
2.4 Linux三剑客之grep常用参数详细总结
2.5 正则表达式扩展部分:egrep或grep -E
其中只有(.)是代表当前字符;(+、?、*)都是代表前面的字符
2.5.1 egrep “+”
2.5.1.1 取出########1@@@@@@@2******中的数字1和2
[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 “?”
2.5.3 egrep “|”
2.5.4 egrep “()”
2.5.5 正则表达式的拓展的小结
(5)元字符
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 -n‘s#支持正则位置##gp’file 【只有前面两个分隔符之间支持正则;-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 【注意,-n和p是一般是一起用的,即取消默认输出,然后打印】
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
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方法1:awk
[root@oldboy ~]# ifconfig eth0|awk -F "[:]+" 'NR==2 {print $4}'
192.1.10.128
3.3.2方法2:sed,在知道行号的情况下
[root@oldboy ~]# ifconfig eth0|sed -nr '2s#^.*dr:(.*) B.*$#\1#gp'
192.1.10.128
3.3.3方法2:sed,在不知道行号的情况下,用过滤的方法过滤出行,再筛选获取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*
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
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
3.7课前考试题6
解答:后面讲
3.8课前考试题7
解答:后面讲
3.9课前考试题8
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键
3.10课前考试题9
注意:现在虚拟机的时间跟不上现实时间,是正常的。到其中架构的时候,会讲优化服务器时间
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命令
画红线的一定要记住!
[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
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
这里由于已经是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里面,如果某个命令的所在路径,不在全局变量里面,那么这个命令将无法执行。
2、which命令查找命令所在路径的时候,也是查找全局环境变量$PATH里的路径的。
3.12课前考试题11
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
3.14课前考试题13
3.15课前考试题14
由于Find查命令是从根目录开始查的,所以效率最低,这里就不列出来了
3.16课前考试题15
解答:先自己做后面讲
3.17课前考试题16
解答:先自己做后面讲
3.18课前考试题17
解答:先自己做后面讲
3.19课前考试题18
3.19.1关机:
3.19.2重启:
3.19.3注销:
3.20课前考试题19
3.21三剑客之sed深度实践讲解*
3.21.1功能说明
3.21.2语法格式
3.21.3命令执行流程
3.21.4使用范例
3.21.5增删改查*
3.21.5.1 增——单行增加
1、a,追加文本到指定行后
2、i,插入文本到指定行前
这里a和i的功能,在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
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
3.21.5.6 改——按行替换
c,用新行替代旧行
3.21.5.7 改——文本替换
3.21.5.8 企业案例7
3.21.5.9 改——变量替换
复习:
单引号的作用,所见即所得;双引号的作用,可以置换变量;无引号,相当于双引号
eval命令,也可以置换变量,哪怕有单引号
3.21.5.10 改——分组替换\( \)和\1的使用说明
3.21.5.11 企业案例7
3.21.5.12 改——特殊符号&代表被替换的内容
3.21.5.13 企业案例8:批量重命名文件
解答:
[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取消默认输出;所以-n和p一般都会搭配来使用
第4章 Linux基础命令集中深入讲解第三部分
4.1ln命令
4.1.1ln,创建硬链接
注意:以上两个文件目录虽然是一样的inode值,但是他们不是同一个文件目录,也不是互为硬链接,因为他们不是在同一个存储介质上。/proc是在内存上的。
4.1.2ln -s,创建软链接
4.2readlink命令
由于查询软链接的源文件,不能查询硬链接的源文件
4.3rename命令
4.3.1重命名的方法1:mv
4.3.2重命名的方法2:rename
4.4basename dirname命令
用武之地:
4.4.1basename,只获取路径后的文件名,或者只获取文件名(不要后缀)
4.4.2dirname,只获取文件的路径
4.5file命令
用于查看文件类型
4.6md5sum命令,计算和校验文件的md5值
每个文件都只有唯一一个md5值,就像文件的指纹一样
所以硬链接和软链接和源文件,他们的md5值的一样的
如下图
4.6.1校验的方法,-c (check)
一般用于校验文件的完整性。
例如网上下载一个镜像文件,人家网站总是会提供一个md5值校验码,用于提供下载完成后的自我校验。如果下载后的文件的校验码一样,说明下载没问题;如果校验码不同,说明下载的文件不完整,这样是会安装失败的。
转载于:https://blog.51cto.com/12140152/1871384